framewebworker 0.1.4 → 0.1.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -528,7 +528,7 @@ var WorkerPool = class {
528
528
  this.available = [];
529
529
  this.waiters = [];
530
530
  for (let i = 0; i < maxConcurrency; i++) {
531
- const w = new Worker(new URL("./render-worker.js", (typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('index.cjs', document.baseURI).href))), { type: "module" });
531
+ const w = new Worker(new URL("./worker/render-worker.js", (typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('index.cjs', document.baseURI).href))), { type: "module" });
532
532
  this.workers.push(w);
533
533
  this.available.push(w);
534
534
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/backends/ffmpeg.ts","../src/captions.ts","../src/index.ts","../src/compositor.ts","../src/worker/pool.ts","../src/stitch.ts","../src/render.ts"],"names":["FFmpegBackend","data","ASPECT_RATIO_MAP","resolveOutputDimensions","seekVideo","drawVideoFrame","createFFmpegBackend","render","renderToUrl"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { RendererBackend, FrameData, EncodeOptions } from '../types.js';\n\nexport class FFmpegBackend implements RendererBackend {\n readonly name = 'ffmpeg.wasm';\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private ffmpeg: any = null;\n private initialized = false;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private _fetchFile: any = null;\n\n async init(): Promise<void> {\n if (this.initialized) return;\n\n const { FFmpeg } = await import('@ffmpeg/ffmpeg').catch(() => {\n throw new Error(\n '[FrameWorker] @ffmpeg/ffmpeg is required. Install it: npm install @ffmpeg/ffmpeg @ffmpeg/util'\n );\n });\n const { fetchFile, toBlobURL } = await import('@ffmpeg/util');\n\n const ffmpeg = new FFmpeg();\n\n const baseURL = 'https://unpkg.com/@ffmpeg/core@0.12.6/dist/esm';\n await ffmpeg.load({\n coreURL: await toBlobURL(`${baseURL}/ffmpeg-core.js`, 'text/javascript'),\n wasmURL: await toBlobURL(`${baseURL}/ffmpeg-core.wasm`, 'application/wasm'),\n });\n\n this._fetchFile = fetchFile;\n this.ffmpeg = ffmpeg;\n this.initialized = true;\n }\n\n async encode(frames: FrameData[], options: EncodeOptions): Promise<Blob> {\n await this.init();\n const { ffmpeg, _fetchFile: fetchFile } = this;\n const { fps, width, height, onProgress, signal } = options;\n\n const total = frames.length;\n for (let i = 0; i < total; i++) {\n if (signal?.aborted) throw new DOMException('Render cancelled', 'AbortError');\n\n const frame = frames[i];\n const offscreen = new OffscreenCanvas(width, height);\n const ctx = offscreen.getContext('2d')!;\n ctx.putImageData(frame.imageData, 0, 0);\n const blob = await offscreen.convertToBlob({ type: 'image/png' });\n const data = await fetchFile(blob);\n await ffmpeg.writeFile(`frame${String(i).padStart(6, '0')}.png`, data);\n\n onProgress?.(i / total * 0.8);\n }\n\n await ffmpeg.exec([\n '-framerate', String(fps),\n '-i', 'frame%06d.png',\n '-c:v', 'libx264',\n '-pix_fmt', 'yuv420p',\n '-preset', 'fast',\n '-crf', '23',\n '-movflags', '+faststart',\n 'output.mp4',\n ]);\n\n onProgress?.(0.95);\n\n const data = await ffmpeg.readFile('output.mp4') as Uint8Array;\n\n for (let i = 0; i < total; i++) {\n await ffmpeg.deleteFile(`frame${String(i).padStart(6, '0')}.png`).catch(() => {});\n }\n await ffmpeg.deleteFile('output.mp4').catch(() => {});\n\n onProgress?.(1);\n\n return new Blob([data.slice().buffer], { type: 'video/mp4' });\n }\n\n async concat(blobs: Blob[], options: EncodeOptions): Promise<Blob> {\n await this.init();\n const { ffmpeg, _fetchFile: fetchFile } = this;\n const { onProgress } = options;\n\n const listLines: string[] = [];\n for (let i = 0; i < blobs.length; i++) {\n const name = `clip${i}.mp4`;\n const data = await fetchFile(blobs[i]);\n await ffmpeg.writeFile(name, data);\n listLines.push(`file '${name}'`);\n onProgress?.(i / blobs.length * 0.6);\n }\n\n const encoder = new TextEncoder();\n await ffmpeg.writeFile('concat.txt', encoder.encode(listLines.join('\\n')));\n\n await ffmpeg.exec([\n '-f', 'concat',\n '-safe', '0',\n '-i', 'concat.txt',\n '-c', 'copy',\n 'stitched.mp4',\n ]);\n\n onProgress?.(0.9);\n\n const out = await ffmpeg.readFile('stitched.mp4') as Uint8Array;\n\n for (let i = 0; i < blobs.length; i++) {\n await ffmpeg.deleteFile(`clip${i}.mp4`).catch(() => {});\n }\n await ffmpeg.deleteFile('concat.txt').catch(() => {});\n await ffmpeg.deleteFile('stitched.mp4').catch(() => {});\n\n onProgress?.(1);\n\n return new Blob([out.slice().buffer], { type: 'video/mp4' });\n }\n\n async destroy(): Promise<void> {\n if (this.ffmpeg) {\n await this.ffmpeg.terminate?.();\n this.ffmpeg = null;\n this.initialized = false;\n }\n }\n}\n\nexport function createFFmpegBackend(): FFmpegBackend {\n return new FFmpegBackend();\n}\n","import type { CaptionSegment, CaptionStyle, CaptionStylePreset } from './types.js';\n\nexport const STYLE_PRESETS: Record<CaptionStylePreset, CaptionStyle> = {\n hormozi: {\n preset: 'hormozi',\n fontFamily: 'Impact, \"Arial Black\", sans-serif',\n fontSize: 64,\n fontWeight: '900',\n color: '#FFFFFF',\n strokeColor: '#000000',\n strokeWidth: 4,\n backgroundColor: 'transparent',\n backgroundPadding: 0,\n backgroundRadius: 0,\n position: 'bottom',\n textAlign: 'center',\n lineHeight: 1.1,\n maxWidth: 0.9,\n shadow: true,\n shadowColor: 'rgba(0,0,0,0.9)',\n shadowBlur: 6,\n shadowOffsetX: 2,\n shadowOffsetY: 2,\n uppercase: true,\n wordHighlight: true,\n wordHighlightColor: '#FFD700',\n wordHighlightTextColor: '#000000',\n },\n modern: {\n preset: 'modern',\n fontFamily: '\"Inter\", \"Helvetica Neue\", Arial, sans-serif',\n fontSize: 42,\n fontWeight: '700',\n color: '#FFFFFF',\n strokeColor: 'transparent',\n strokeWidth: 0,\n backgroundColor: 'rgba(0,0,0,0.65)',\n backgroundPadding: 12,\n backgroundRadius: 8,\n position: 'bottom',\n textAlign: 'center',\n lineHeight: 1.3,\n maxWidth: 0.85,\n shadow: false,\n shadowColor: 'transparent',\n shadowBlur: 0,\n shadowOffsetX: 0,\n shadowOffsetY: 0,\n uppercase: false,\n wordHighlight: false,\n wordHighlightColor: '#3B82F6',\n wordHighlightTextColor: '#FFFFFF',\n },\n minimal: {\n preset: 'minimal',\n fontFamily: '\"Helvetica Neue\", Arial, sans-serif',\n fontSize: 36,\n fontWeight: '400',\n color: '#FFFFFF',\n strokeColor: 'transparent',\n strokeWidth: 0,\n backgroundColor: 'transparent',\n backgroundPadding: 0,\n backgroundRadius: 0,\n position: 'bottom',\n textAlign: 'center',\n lineHeight: 1.4,\n maxWidth: 0.8,\n shadow: true,\n shadowColor: 'rgba(0,0,0,0.8)',\n shadowBlur: 8,\n shadowOffsetX: 0,\n shadowOffsetY: 2,\n uppercase: false,\n wordHighlight: false,\n wordHighlightColor: '#FFFFFF',\n wordHighlightTextColor: '#000000',\n },\n bold: {\n preset: 'bold',\n fontFamily: '\"Arial Black\", \"Helvetica Neue\", Arial, sans-serif',\n fontSize: 56,\n fontWeight: '900',\n color: '#FFFF00',\n strokeColor: '#000000',\n strokeWidth: 5,\n backgroundColor: 'transparent',\n backgroundPadding: 0,\n backgroundRadius: 0,\n position: 'center',\n textAlign: 'center',\n lineHeight: 1.2,\n maxWidth: 0.88,\n shadow: true,\n shadowColor: 'rgba(0,0,0,1)',\n shadowBlur: 4,\n shadowOffsetX: 3,\n shadowOffsetY: 3,\n uppercase: true,\n wordHighlight: false,\n wordHighlightColor: '#FF0000',\n wordHighlightTextColor: '#FFFFFF',\n },\n};\n\nexport function mergeStyle(\n base: CaptionStyle,\n overrides?: Partial<CaptionStyle>\n): CaptionStyle {\n return overrides ? { ...base, ...overrides } : base;\n}\n\nexport function getActiveCaptions(\n segments: CaptionSegment[],\n currentTime: number\n): CaptionSegment[] {\n return segments.filter(\n (seg) => currentTime >= seg.startTime && currentTime < seg.endTime\n );\n}\n\nfunction wrapText(\n ctx: CanvasRenderingContext2D,\n text: string,\n maxWidth: number\n): string[] {\n const words = text.split(' ');\n const lines: string[] = [];\n let current = '';\n\n for (const word of words) {\n const test = current ? `${current} ${word}` : word;\n if (ctx.measureText(test).width > maxWidth && current) {\n lines.push(current);\n current = word;\n } else {\n current = test;\n }\n }\n if (current) lines.push(current);\n return lines;\n}\n\nexport function renderCaption(\n ctx: CanvasRenderingContext2D,\n segment: CaptionSegment,\n resolvedStyle: CaptionStyle,\n canvasWidth: number,\n canvasHeight: number\n): void {\n const style = resolvedStyle;\n const text = style.uppercase ? segment.text.toUpperCase() : segment.text;\n\n ctx.save();\n\n const scaledFontSize = (style.fontSize / 1080) * canvasHeight;\n ctx.font = `${style.fontWeight} ${scaledFontSize}px ${style.fontFamily}`;\n ctx.textAlign = style.textAlign;\n ctx.textBaseline = 'bottom';\n\n const maxPx = style.maxWidth * canvasWidth;\n const lines = wrapText(ctx, text, maxPx);\n const lineH = scaledFontSize * style.lineHeight;\n const totalH = lines.length * lineH;\n\n let baseY: number;\n if (style.position === 'top') {\n baseY = scaledFontSize * 1.5;\n } else if (style.position === 'center') {\n baseY = canvasHeight / 2 - totalH / 2 + lineH;\n } else {\n baseY = canvasHeight - scaledFontSize * 1.2;\n }\n\n const cx = canvasWidth / 2;\n\n lines.forEach((line, i) => {\n const y = baseY + i * lineH;\n\n // Background box\n if (style.backgroundColor && style.backgroundColor !== 'transparent') {\n const metrics = ctx.measureText(line);\n const bw = metrics.width + style.backgroundPadding * 2;\n const bh = lineH + style.backgroundPadding;\n const bx = cx - bw / 2;\n const by = y - lineH;\n\n ctx.fillStyle = style.backgroundColor;\n if (style.backgroundRadius > 0) {\n roundRect(ctx, bx, by, bw, bh, style.backgroundRadius);\n ctx.fill();\n } else {\n ctx.fillRect(bx, by, bw, bh);\n }\n }\n\n // Shadow\n if (style.shadow) {\n ctx.shadowColor = style.shadowColor;\n ctx.shadowBlur = style.shadowBlur;\n ctx.shadowOffsetX = style.shadowOffsetX;\n ctx.shadowOffsetY = style.shadowOffsetY;\n }\n\n // Stroke\n if (style.strokeWidth > 0 && style.strokeColor !== 'transparent') {\n ctx.lineWidth = style.strokeWidth;\n ctx.strokeStyle = style.strokeColor;\n ctx.strokeText(line, cx, y);\n }\n\n // Fill\n ctx.shadowColor = 'transparent';\n ctx.shadowBlur = 0;\n ctx.fillStyle = style.color;\n ctx.fillText(line, cx, y);\n });\n\n ctx.restore();\n}\n\nfunction roundRect(\n ctx: CanvasRenderingContext2D,\n x: number,\n y: number,\n w: number,\n h: number,\n r: number\n): void {\n ctx.beginPath();\n ctx.moveTo(x + r, y);\n ctx.lineTo(x + w - r, y);\n ctx.quadraticCurveTo(x + w, y, x + w, y + r);\n ctx.lineTo(x + w, y + h - r);\n ctx.quadraticCurveTo(x + w, y + h, x + w - r, y + h);\n ctx.lineTo(x + r, y + h);\n ctx.quadraticCurveTo(x, y + h, x, y + h - r);\n ctx.lineTo(x, y + r);\n ctx.quadraticCurveTo(x, y, x + r, y);\n ctx.closePath();\n}\n","export type {\n ClipInput,\n CaptionSegment,\n CaptionStyle,\n CaptionStylePreset,\n AspectRatio,\n CropOptions,\n CaptionOptions,\n RenderOptions,\n EncodeOptions,\n FrameData,\n RendererBackend,\n FrameWorkerConfig,\n FrameWorker,\n ClipStatus,\n ClipProgress,\n RichProgress,\n StitchOptions,\n ClipMetrics,\n RenderMetrics,\n Segment,\n SingleVideoRenderOptions,\n} from './types.js';\n\nexport { STYLE_PRESETS } from './captions.js';\nexport { FFmpegBackend, createFFmpegBackend } from './backends/ffmpeg.js';\nexport { render, renderToUrl } from './render.js';\n\nimport type { ClipInput, RenderOptions, StitchOptions, RenderMetrics, FrameWorkerConfig, FrameWorker, RendererBackend } from './types.js';\nimport { extractFrames } from './compositor.js';\nimport { stitchClips } from './stitch.js';\n\nexport function createFrameWorker(config: FrameWorkerConfig = {}): FrameWorker {\n const fps = config.fps ?? 30;\n const width = config.width ?? 1280;\n const height = config.height ?? 720;\n\n let _backend: RendererBackend | null = config.backend ?? null;\n\n async function getBackend(): Promise<RendererBackend> {\n if (!_backend) {\n const { createFFmpegBackend } = await import('./backends/ffmpeg.js');\n _backend = createFFmpegBackend();\n }\n await _backend.init();\n return _backend;\n }\n\n async function render(clip: ClipInput, options: RenderOptions = {}): Promise<Blob> {\n const mergedOpts: RenderOptions = { fps, width, height, ...options };\n const backend = await getBackend();\n\n const onProgress = mergedOpts.onProgress;\n const frames = await extractFrames(clip, {\n ...mergedOpts,\n onProgress: onProgress ? (p) => onProgress(p * 0.85) : undefined,\n });\n\n return backend.encode(frames, {\n width: mergedOpts.width ?? width,\n height: mergedOpts.height ?? height,\n fps: mergedOpts.fps ?? fps,\n mimeType: mergedOpts.mimeType ?? 'video/mp4',\n quality: mergedOpts.quality ?? 0.92,\n encoderOptions: mergedOpts.encoderOptions,\n onProgress: onProgress ? (p) => onProgress(0.85 + p * 0.15) : undefined,\n signal: mergedOpts.signal,\n });\n }\n\n async function renderToUrl(clip: ClipInput, options?: RenderOptions): Promise<string> {\n const blob = await render(clip, options);\n return URL.createObjectURL(blob);\n }\n\n async function stitch(clips: ClipInput[], options: StitchOptions = {}): Promise<{ blob: Blob; metrics: RenderMetrics }> {\n const mergedOpts: StitchOptions = { fps, width, height, ...options };\n const backend = await getBackend();\n return stitchClips(clips, backend, mergedOpts);\n }\n\n async function stitchToUrl(clips: ClipInput[], options?: StitchOptions): Promise<{ url: string; metrics: RenderMetrics }> {\n const { blob, metrics } = await stitch(clips, options);\n return { url: URL.createObjectURL(blob), metrics };\n }\n\n return { render, renderToUrl, stitch, stitchToUrl };\n}\n","import type { ClipInput, FrameData, RenderOptions } from './types.js';\nimport { STYLE_PRESETS, mergeStyle, getActiveCaptions, renderCaption } from './captions.js';\n\nconst ASPECT_RATIO_MAP: Record<string, [number, number]> = {\n '16:9': [16, 9],\n '9:16': [9, 16],\n '1:1': [1, 1],\n '4:3': [4, 3],\n '3:4': [3, 4],\n original: [0, 0],\n};\n\nfunction resolveOutputDimensions(\n clip: ClipInput,\n videoWidth: number,\n videoHeight: number,\n options: RenderOptions\n): [number, number] {\n const ar = clip.aspectRatio ?? 'original';\n const ratio = ASPECT_RATIO_MAP[ar] ?? [0, 0];\n\n if (ratio[0] === 0) {\n return [options.width ?? videoWidth, options.height ?? videoHeight];\n }\n\n const w = options.width ?? 1280;\n const h = Math.round(w * (ratio[1] / ratio[0]));\n return [w, h];\n}\n\nexport async function extractFrames(\n clip: ClipInput,\n options: RenderOptions\n): Promise<FrameData[]> {\n const fps = options.fps ?? 30;\n const onProgress = options.onProgress;\n const signal = options.signal;\n\n let srcUrl: string;\n let needsRevoke = false;\n\n if (typeof clip.source === 'string') {\n srcUrl = clip.source;\n } else if (clip.source instanceof HTMLVideoElement) {\n srcUrl = clip.source.src;\n } else {\n srcUrl = URL.createObjectURL(clip.source as Blob);\n needsRevoke = true;\n }\n\n const video = document.createElement('video');\n video.muted = true;\n video.crossOrigin = 'anonymous';\n video.preload = 'auto';\n\n await new Promise<void>((resolve, reject) => {\n video.onloadedmetadata = () => resolve();\n video.onerror = () => reject(new Error(`Failed to load video: ${srcUrl}`));\n video.src = srcUrl;\n });\n\n const duration = video.duration;\n const startTime = clip.startTime ?? 0;\n const endTime = clip.endTime ?? duration;\n const clipDuration = endTime - startTime;\n\n const [outW, outH] = resolveOutputDimensions(\n clip,\n video.videoWidth,\n video.videoHeight,\n options\n );\n\n const canvas = document.createElement('canvas');\n canvas.width = outW;\n canvas.height = outH;\n const ctx = canvas.getContext('2d', { willReadFrequently: true })!;\n\n const totalFrames = Math.ceil(clipDuration * fps);\n const frames: FrameData[] = [];\n\n const captionSegments = clip.captions?.segments ?? [];\n const baseStylePreset = clip.captions?.style?.preset ?? 'modern';\n const baseStyle = mergeStyle(\n STYLE_PRESETS[baseStylePreset],\n clip.captions?.style\n );\n\n for (let i = 0; i < totalFrames; i++) {\n if (signal?.aborted) throw new DOMException('Render cancelled', 'AbortError');\n\n const t = startTime + (i / fps);\n\n await seekVideo(video, t);\n ctx.clearRect(0, 0, outW, outH);\n\n drawVideoFrame(ctx, video, clip, outW, outH);\n\n if (captionSegments.length > 0) {\n const active = getActiveCaptions(captionSegments, t - startTime);\n for (const seg of active) {\n const segStyle = mergeStyle(baseStyle, seg.style);\n renderCaption(ctx, seg, segStyle, outW, outH);\n }\n }\n\n const imageData = ctx.getImageData(0, 0, outW, outH);\n frames.push({ imageData, timestamp: t - startTime, width: outW, height: outH });\n\n if (onProgress) onProgress(i / totalFrames);\n }\n\n if (needsRevoke) URL.revokeObjectURL(srcUrl);\n\n return frames;\n}\n\nfunction drawVideoFrame(\n ctx: CanvasRenderingContext2D,\n video: HTMLVideoElement,\n clip: ClipInput,\n outW: number,\n outH: number\n): void {\n const vw = video.videoWidth;\n const vh = video.videoHeight;\n\n if (clip.crop) {\n const { x, y, width, height } = clip.crop;\n ctx.drawImage(\n video,\n x * vw, y * vh, width * vw, height * vh,\n 0, 0, outW, outH\n );\n } else {\n const videoAR = vw / vh;\n const outAR = outW / outH;\n\n let sx = 0, sy = 0, sw = vw, sh = vh;\n if (videoAR > outAR) {\n sw = vh * outAR;\n sx = (vw - sw) / 2;\n } else if (videoAR < outAR) {\n sh = vw / outAR;\n sy = (vh - sh) / 2;\n }\n ctx.drawImage(video, sx, sy, sw, sh, 0, 0, outW, outH);\n }\n}\n\nfunction seekVideo(video: HTMLVideoElement, time: number): Promise<void> {\n return new Promise((resolve) => {\n if (Math.abs(video.currentTime - time) < 0.001) {\n resolve();\n return;\n }\n const onSeeked = () => {\n video.removeEventListener('seeked', onSeeked);\n resolve();\n };\n video.addEventListener('seeked', onSeeked);\n video.currentTime = time;\n });\n}\n","import type { ClipInput, FrameData } from '../types.js';\nimport type { WorkerInbound, WorkerOutbound, TransferableFrame } from './protocol.js';\n\nconst ASPECT_RATIO_MAP: Record<string, [number, number]> = {\n '16:9': [16, 9],\n '9:16': [9, 16],\n '1:1': [1, 1],\n '4:3': [4, 3],\n '3:4': [3, 4],\n original: [0, 0],\n};\n\nfunction resolveOutputDimensions(\n clip: ClipInput,\n videoWidth: number,\n videoHeight: number,\n width: number,\n height: number\n): [number, number] {\n const ar = clip.aspectRatio ?? 'original';\n const ratio = ASPECT_RATIO_MAP[ar] ?? [0, 0];\n if (ratio[0] === 0) return [width, height];\n const w = width;\n const h = Math.round(w * (ratio[1] / ratio[0]));\n return [w, h];\n}\n\nfunction seekVideo(video: HTMLVideoElement, time: number): Promise<void> {\n return new Promise((resolve) => {\n if (Math.abs(video.currentTime - time) < 0.001) { resolve(); return; }\n const onSeeked = () => { video.removeEventListener('seeked', onSeeked); resolve(); };\n video.addEventListener('seeked', onSeeked);\n video.currentTime = time;\n });\n}\n\nfunction drawVideoFrame(\n ctx: CanvasRenderingContext2D,\n video: HTMLVideoElement,\n clip: ClipInput,\n outW: number,\n outH: number\n): void {\n const vw = video.videoWidth;\n const vh = video.videoHeight;\n\n if (clip.crop) {\n const { x, y, width, height } = clip.crop;\n ctx.drawImage(video, x * vw, y * vh, width * vw, height * vh, 0, 0, outW, outH);\n } else {\n const videoAR = vw / vh;\n const outAR = outW / outH;\n let sx = 0, sy = 0, sw = vw, sh = vh;\n if (videoAR > outAR) {\n sw = vh * outAR;\n sx = (vw - sw) / 2;\n } else if (videoAR < outAR) {\n sh = vw / outAR;\n sy = (vh - sh) / 2;\n }\n ctx.drawImage(video, sx, sy, sw, sh, 0, 0, outW, outH);\n }\n}\n\nexport class WorkerPool {\n private readonly workers: Worker[] = [];\n private readonly available: Worker[] = [];\n private readonly waiters: Array<(w: Worker) => void> = [];\n\n constructor(maxConcurrency: number) {\n for (let i = 0; i < maxConcurrency; i++) {\n const w = new Worker(new URL('./render-worker.js', import.meta.url), { type: 'module' });\n this.workers.push(w);\n this.available.push(w);\n }\n }\n\n private acquire(): Promise<Worker> {\n if (this.available.length > 0) return Promise.resolve(this.available.pop()!);\n return new Promise(resolve => this.waiters.push(resolve));\n }\n\n private release(worker: Worker): void {\n if (this.waiters.length > 0) {\n this.waiters.shift()!(worker);\n } else {\n this.available.push(worker);\n }\n }\n\n async dispatch(\n clip: ClipInput,\n width: number,\n height: number,\n fps: number,\n signal?: AbortSignal,\n onProgress?: (p: number) => void\n ): Promise<FrameData[]> {\n const worker = await this.acquire();\n try {\n return await this.processClip(worker, clip, width, height, fps, signal, onProgress);\n } finally {\n this.release(worker);\n }\n }\n\n private async processClip(\n worker: Worker,\n clip: ClipInput,\n width: number,\n height: number,\n fps: number,\n signal?: AbortSignal,\n onProgress?: (p: number) => void\n ): Promise<FrameData[]> {\n let srcUrl: string;\n let needsRevoke = false;\n\n if (typeof clip.source === 'string') {\n srcUrl = clip.source;\n } else if (clip.source instanceof HTMLVideoElement) {\n srcUrl = clip.source.src;\n } else {\n srcUrl = URL.createObjectURL(clip.source as Blob);\n needsRevoke = true;\n }\n\n const video = document.createElement('video');\n video.muted = true;\n video.crossOrigin = 'anonymous';\n video.preload = 'auto';\n\n await new Promise<void>((resolve, reject) => {\n video.onloadedmetadata = () => resolve();\n video.onerror = () => reject(new Error(`Failed to load video: ${srcUrl}`));\n video.src = srcUrl;\n });\n\n const duration = video.duration;\n const startTime = clip.startTime ?? 0;\n const endTime = clip.endTime ?? duration;\n const clipDuration = endTime - startTime;\n const [outW, outH] = resolveOutputDimensions(clip, video.videoWidth, video.videoHeight, width, height);\n const totalFrames = Math.ceil(clipDuration * fps);\n\n // Temp canvas applies crop/aspect-ratio before handing bitmap to worker\n const canvas = document.createElement('canvas');\n canvas.width = outW;\n canvas.height = outH;\n const ctx = canvas.getContext('2d')!;\n\n // Wire up worker message handler before sending init\n const resultPromise = new Promise<TransferableFrame[]>((resolve, reject) => {\n const onMessage = (e: MessageEvent<WorkerOutbound>) => {\n const msg = e.data;\n if (msg.type === 'done') {\n worker.removeEventListener('message', onMessage);\n resolve(msg.frames);\n } else if (msg.type === 'error') {\n worker.removeEventListener('message', onMessage);\n reject(new Error(msg.message));\n } else if (msg.type === 'progress') {\n onProgress?.(msg.value);\n }\n };\n worker.addEventListener('message', onMessage);\n });\n\n const initMsg: WorkerInbound = {\n type: 'init',\n meta: { width: outW, height: outH, fps, captions: clip.captions, totalFrames },\n };\n worker.postMessage(initMsg);\n\n try {\n for (let i = 0; i < totalFrames; i++) {\n if (signal?.aborted) {\n worker.postMessage({ type: 'abort' } satisfies WorkerInbound);\n throw new DOMException('Render cancelled', 'AbortError');\n }\n\n const t = startTime + (i / fps);\n await seekVideo(video, t);\n ctx.clearRect(0, 0, outW, outH);\n drawVideoFrame(ctx, video, clip, outW, outH);\n\n const bitmap = await createImageBitmap(canvas);\n const frameMsg: WorkerInbound = { type: 'frame', bitmap, timestamp: t - startTime, index: i };\n worker.postMessage(frameMsg, [bitmap]);\n }\n\n worker.postMessage({ type: 'end' } satisfies WorkerInbound);\n const transferableFrames = await resultPromise;\n\n return transferableFrames.map(f => ({\n imageData: new ImageData(new Uint8ClampedArray(f.buffer), f.width, f.height),\n timestamp: f.timestamp,\n width: f.width,\n height: f.height,\n }));\n } finally {\n if (needsRevoke) URL.revokeObjectURL(srcUrl);\n }\n }\n\n terminate(): void {\n for (const w of this.workers) w.terminate();\n this.workers.length = 0;\n this.available.length = 0;\n }\n}\n","import type { ClipInput, RendererBackend, FrameData, ClipProgress, StitchOptions, ClipMetrics, RenderMetrics } from './types.js';\nimport { extractFrames } from './compositor.js';\nimport { WorkerPool } from './worker/pool.js';\n\nfunction supportsOffscreenWorkers(): boolean {\n return (\n typeof Worker !== 'undefined' &&\n typeof OffscreenCanvas !== 'undefined' &&\n typeof createImageBitmap !== 'undefined'\n );\n}\n\nexport async function stitchClips(\n clips: ClipInput[],\n backend: RendererBackend,\n options: StitchOptions\n): Promise<{ blob: Blob; metrics: RenderMetrics }> {\n if (supportsOffscreenWorkers() && clips.length > 1) {\n return stitchParallel(clips, backend, options);\n }\n return stitchSequential(clips, backend, options);\n}\n\n// ── Sequential fallback (older browsers / single clip) ────────────────────────\n\nasync function stitchSequential(\n clips: ClipInput[],\n backend: RendererBackend,\n options: StitchOptions\n): Promise<{ blob: Blob; metrics: RenderMetrics }> {\n const fps = options.fps ?? 30;\n const width = options.width ?? 1280;\n const height = options.height ?? 720;\n const { onProgress, onComplete, signal } = options;\n\n const stitchStart = performance.now();\n\n const clipStatuses: ClipProgress[] = clips.map((_, i) => ({\n index: i, status: 'pending', progress: 0,\n }));\n const clipMetrics: ClipMetrics[] = [];\n\n const emit = (overall: number) => {\n onProgress?.({ overall, clips: clipStatuses.slice() });\n };\n\n const blobs: Blob[] = [];\n\n for (let ci = 0; ci < clips.length; ci++) {\n clipStatuses[ci].status = 'rendering';\n emit(ci / clips.length);\n\n const extractStart = performance.now();\n const frames = await extractFrames(clips[ci], {\n fps, width, height,\n mimeType: options.mimeType,\n quality: options.quality,\n encoderOptions: options.encoderOptions,\n signal,\n onProgress: (p) => {\n clipStatuses[ci].progress = p * 0.9;\n emit((ci + p * 0.9) / clips.length);\n },\n });\n const extractionMs = performance.now() - extractStart;\n\n clipStatuses[ci].status = 'encoding';\n const encodeStart = performance.now();\n const blob = await backend.encode(frames, {\n width, height, fps,\n mimeType: options.mimeType ?? 'video/mp4',\n quality: options.quality ?? 0.92,\n encoderOptions: options.encoderOptions,\n signal,\n onProgress: (p) => {\n clipStatuses[ci].progress = 0.9 + p * 0.1;\n emit((ci + 0.9 + p * 0.1) / clips.length);\n },\n });\n const encodingMs = performance.now() - encodeStart;\n\n clipStatuses[ci].status = 'done';\n clipStatuses[ci].progress = 1;\n clipMetrics.push({\n clipId: String(ci),\n extractionMs,\n encodingMs,\n totalMs: extractionMs + encodingMs,\n framesExtracted: frames.length,\n });\n blobs.push(blob);\n }\n\n let finalBlob: Blob;\n let stitchMs = 0;\n\n if (blobs.length === 1) {\n emit(1);\n finalBlob = blobs[0];\n } else {\n const stitchPhaseStart = performance.now();\n finalBlob = await backend.concat(blobs, {\n width, height, fps,\n mimeType: options.mimeType ?? 'video/mp4',\n quality: options.quality ?? 0.92,\n signal,\n onProgress: (p) => emit((clips.length - 1 + p) / clips.length),\n });\n stitchMs = performance.now() - stitchPhaseStart;\n }\n\n const totalMs = performance.now() - stitchStart;\n const totalFrames = clipMetrics.reduce((s, c) => s + c.framesExtracted, 0);\n const metrics: RenderMetrics = {\n totalMs,\n extractionMs: clipMetrics.reduce((s, c) => s + c.extractionMs, 0),\n encodingMs: clipMetrics.reduce((s, c) => s + c.encodingMs, 0),\n stitchMs,\n clips: clipMetrics,\n framesPerSecond: totalFrames / (totalMs / 1000),\n };\n\n onComplete?.(metrics);\n return { blob: finalBlob, metrics };\n}\n\n// ── Parallel path (OffscreenCanvas + WorkerPool) ──────────────────────────────\n\nasync function stitchParallel(\n clips: ClipInput[],\n backend: RendererBackend,\n options: StitchOptions\n): Promise<{ blob: Blob; metrics: RenderMetrics }> {\n const fps = options.fps ?? 30;\n const width = options.width ?? 1280;\n const height = options.height ?? 720;\n const { onProgress, onComplete, signal } = options;\n\n const stitchStart = performance.now();\n\n const concurrency = Math.min(\n clips.length,\n (typeof navigator !== 'undefined' ? navigator.hardwareConcurrency || 2 : 2),\n 4\n );\n\n const clipStatuses: ClipProgress[] = clips.map((_, i) => ({\n index: i, status: 'pending', progress: 0,\n }));\n const clipMetrics: Array<ClipMetrics> = new Array(clips.length);\n\n const emit = () => {\n const overall = clipStatuses.reduce((sum, c) => sum + c.progress, 0) / clips.length;\n onProgress?.({ overall, clips: clipStatuses.slice() });\n };\n\n const pool = new WorkerPool(concurrency);\n const blobs: Blob[] = new Array(clips.length);\n let encodeChain = Promise.resolve();\n\n try {\n await Promise.all(\n clips.map(async (clip, ci) => {\n clipStatuses[ci].status = 'rendering';\n emit();\n\n const extractStart = performance.now();\n const frames: FrameData[] = await pool.dispatch(\n clip, width, height, fps, signal,\n (p) => {\n clipStatuses[ci].progress = p * 0.85;\n emit();\n }\n );\n const extractionMs = performance.now() - extractStart;\n\n clipStatuses[ci].status = 'encoding';\n clipStatuses[ci].progress = 0.85;\n emit();\n\n await new Promise<void>((resolve, reject) => {\n encodeChain = encodeChain.then(async () => {\n const encodeStart = performance.now();\n try {\n blobs[ci] = await backend.encode(frames, {\n width, height, fps,\n mimeType: options.mimeType ?? 'video/mp4',\n quality: options.quality ?? 0.92,\n encoderOptions: options.encoderOptions,\n signal,\n onProgress: (p) => {\n clipStatuses[ci].progress = 0.85 + p * 0.15;\n emit();\n },\n });\n const encodingMs = performance.now() - encodeStart;\n clipMetrics[ci] = {\n clipId: String(ci),\n extractionMs,\n encodingMs,\n totalMs: extractionMs + encodingMs,\n framesExtracted: frames.length,\n };\n clipStatuses[ci].status = 'done';\n clipStatuses[ci].progress = 1;\n emit();\n resolve();\n } catch (err) {\n clipStatuses[ci].status = 'error';\n reject(err);\n throw err;\n }\n });\n });\n })\n );\n\n let finalBlob: Blob;\n let stitchMs = 0;\n\n if (blobs.length === 1) {\n onProgress?.({ overall: 1, clips: clipStatuses.slice() });\n finalBlob = blobs[0];\n } else {\n const stitchPhaseStart = performance.now();\n finalBlob = await backend.concat(blobs, {\n width, height, fps,\n mimeType: options.mimeType ?? 'video/mp4',\n quality: options.quality ?? 0.92,\n signal,\n });\n stitchMs = performance.now() - stitchPhaseStart;\n }\n\n const totalMs = performance.now() - stitchStart;\n const totalFrames = clipMetrics.reduce((s, c) => s + c.framesExtracted, 0);\n const metrics: RenderMetrics = {\n totalMs,\n extractionMs: clipMetrics.reduce((s, c) => s + c.extractionMs, 0),\n encodingMs: clipMetrics.reduce((s, c) => s + c.encodingMs, 0),\n stitchMs,\n clips: clipMetrics,\n framesPerSecond: totalFrames / (totalMs / 1000),\n };\n\n onComplete?.(metrics);\n return { blob: finalBlob, metrics };\n } finally {\n pool.terminate();\n }\n}\n","import type { Segment, SingleVideoRenderOptions, RenderMetrics, ClipInput } from './types.js';\nimport { stitchClips } from './stitch.js';\nimport { createFFmpegBackend } from './backends/ffmpeg.js';\n\nfunction segmentsToClips(videoUrl: string, segments: Segment[]): ClipInput[] {\n return segments.map((seg) => ({\n source: videoUrl,\n startTime: seg.start,\n endTime: seg.end,\n captions: seg.captions?.length ? { segments: seg.captions } : undefined,\n }));\n}\n\nexport async function render(\n videoUrl: string,\n segments: Segment[],\n options?: SingleVideoRenderOptions\n): Promise<{ blob: Blob; metrics: RenderMetrics }> {\n const clips = segmentsToClips(videoUrl, segments);\n const backend = createFFmpegBackend();\n await backend.init();\n return stitchClips(clips, backend, options ?? {});\n}\n\nexport async function renderToUrl(\n videoUrl: string,\n segments: Segment[],\n options?: SingleVideoRenderOptions\n): Promise<{ url: string; metrics: RenderMetrics }> {\n const { blob, metrics } = await render(videoUrl, segments, options);\n return { url: URL.createObjectURL(blob), metrics };\n}\n"]}
1
+ {"version":3,"sources":["../src/backends/ffmpeg.ts","../src/captions.ts","../src/index.ts","../src/compositor.ts","../src/worker/pool.ts","../src/stitch.ts","../src/render.ts"],"names":["FFmpegBackend","data","ASPECT_RATIO_MAP","resolveOutputDimensions","seekVideo","drawVideoFrame","createFFmpegBackend","render","renderToUrl"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { RendererBackend, FrameData, EncodeOptions } from '../types.js';\n\nexport class FFmpegBackend implements RendererBackend {\n readonly name = 'ffmpeg.wasm';\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private ffmpeg: any = null;\n private initialized = false;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private _fetchFile: any = null;\n\n async init(): Promise<void> {\n if (this.initialized) return;\n\n const { FFmpeg } = await import('@ffmpeg/ffmpeg').catch(() => {\n throw new Error(\n '[FrameWorker] @ffmpeg/ffmpeg is required. Install it: npm install @ffmpeg/ffmpeg @ffmpeg/util'\n );\n });\n const { fetchFile, toBlobURL } = await import('@ffmpeg/util');\n\n const ffmpeg = new FFmpeg();\n\n const baseURL = 'https://unpkg.com/@ffmpeg/core@0.12.6/dist/esm';\n await ffmpeg.load({\n coreURL: await toBlobURL(`${baseURL}/ffmpeg-core.js`, 'text/javascript'),\n wasmURL: await toBlobURL(`${baseURL}/ffmpeg-core.wasm`, 'application/wasm'),\n });\n\n this._fetchFile = fetchFile;\n this.ffmpeg = ffmpeg;\n this.initialized = true;\n }\n\n async encode(frames: FrameData[], options: EncodeOptions): Promise<Blob> {\n await this.init();\n const { ffmpeg, _fetchFile: fetchFile } = this;\n const { fps, width, height, onProgress, signal } = options;\n\n const total = frames.length;\n for (let i = 0; i < total; i++) {\n if (signal?.aborted) throw new DOMException('Render cancelled', 'AbortError');\n\n const frame = frames[i];\n const offscreen = new OffscreenCanvas(width, height);\n const ctx = offscreen.getContext('2d')!;\n ctx.putImageData(frame.imageData, 0, 0);\n const blob = await offscreen.convertToBlob({ type: 'image/png' });\n const data = await fetchFile(blob);\n await ffmpeg.writeFile(`frame${String(i).padStart(6, '0')}.png`, data);\n\n onProgress?.(i / total * 0.8);\n }\n\n await ffmpeg.exec([\n '-framerate', String(fps),\n '-i', 'frame%06d.png',\n '-c:v', 'libx264',\n '-pix_fmt', 'yuv420p',\n '-preset', 'fast',\n '-crf', '23',\n '-movflags', '+faststart',\n 'output.mp4',\n ]);\n\n onProgress?.(0.95);\n\n const data = await ffmpeg.readFile('output.mp4') as Uint8Array;\n\n for (let i = 0; i < total; i++) {\n await ffmpeg.deleteFile(`frame${String(i).padStart(6, '0')}.png`).catch(() => {});\n }\n await ffmpeg.deleteFile('output.mp4').catch(() => {});\n\n onProgress?.(1);\n\n return new Blob([data.slice().buffer], { type: 'video/mp4' });\n }\n\n async concat(blobs: Blob[], options: EncodeOptions): Promise<Blob> {\n await this.init();\n const { ffmpeg, _fetchFile: fetchFile } = this;\n const { onProgress } = options;\n\n const listLines: string[] = [];\n for (let i = 0; i < blobs.length; i++) {\n const name = `clip${i}.mp4`;\n const data = await fetchFile(blobs[i]);\n await ffmpeg.writeFile(name, data);\n listLines.push(`file '${name}'`);\n onProgress?.(i / blobs.length * 0.6);\n }\n\n const encoder = new TextEncoder();\n await ffmpeg.writeFile('concat.txt', encoder.encode(listLines.join('\\n')));\n\n await ffmpeg.exec([\n '-f', 'concat',\n '-safe', '0',\n '-i', 'concat.txt',\n '-c', 'copy',\n 'stitched.mp4',\n ]);\n\n onProgress?.(0.9);\n\n const out = await ffmpeg.readFile('stitched.mp4') as Uint8Array;\n\n for (let i = 0; i < blobs.length; i++) {\n await ffmpeg.deleteFile(`clip${i}.mp4`).catch(() => {});\n }\n await ffmpeg.deleteFile('concat.txt').catch(() => {});\n await ffmpeg.deleteFile('stitched.mp4').catch(() => {});\n\n onProgress?.(1);\n\n return new Blob([out.slice().buffer], { type: 'video/mp4' });\n }\n\n async destroy(): Promise<void> {\n if (this.ffmpeg) {\n await this.ffmpeg.terminate?.();\n this.ffmpeg = null;\n this.initialized = false;\n }\n }\n}\n\nexport function createFFmpegBackend(): FFmpegBackend {\n return new FFmpegBackend();\n}\n","import type { CaptionSegment, CaptionStyle, CaptionStylePreset } from './types.js';\n\nexport const STYLE_PRESETS: Record<CaptionStylePreset, CaptionStyle> = {\n hormozi: {\n preset: 'hormozi',\n fontFamily: 'Impact, \"Arial Black\", sans-serif',\n fontSize: 64,\n fontWeight: '900',\n color: '#FFFFFF',\n strokeColor: '#000000',\n strokeWidth: 4,\n backgroundColor: 'transparent',\n backgroundPadding: 0,\n backgroundRadius: 0,\n position: 'bottom',\n textAlign: 'center',\n lineHeight: 1.1,\n maxWidth: 0.9,\n shadow: true,\n shadowColor: 'rgba(0,0,0,0.9)',\n shadowBlur: 6,\n shadowOffsetX: 2,\n shadowOffsetY: 2,\n uppercase: true,\n wordHighlight: true,\n wordHighlightColor: '#FFD700',\n wordHighlightTextColor: '#000000',\n },\n modern: {\n preset: 'modern',\n fontFamily: '\"Inter\", \"Helvetica Neue\", Arial, sans-serif',\n fontSize: 42,\n fontWeight: '700',\n color: '#FFFFFF',\n strokeColor: 'transparent',\n strokeWidth: 0,\n backgroundColor: 'rgba(0,0,0,0.65)',\n backgroundPadding: 12,\n backgroundRadius: 8,\n position: 'bottom',\n textAlign: 'center',\n lineHeight: 1.3,\n maxWidth: 0.85,\n shadow: false,\n shadowColor: 'transparent',\n shadowBlur: 0,\n shadowOffsetX: 0,\n shadowOffsetY: 0,\n uppercase: false,\n wordHighlight: false,\n wordHighlightColor: '#3B82F6',\n wordHighlightTextColor: '#FFFFFF',\n },\n minimal: {\n preset: 'minimal',\n fontFamily: '\"Helvetica Neue\", Arial, sans-serif',\n fontSize: 36,\n fontWeight: '400',\n color: '#FFFFFF',\n strokeColor: 'transparent',\n strokeWidth: 0,\n backgroundColor: 'transparent',\n backgroundPadding: 0,\n backgroundRadius: 0,\n position: 'bottom',\n textAlign: 'center',\n lineHeight: 1.4,\n maxWidth: 0.8,\n shadow: true,\n shadowColor: 'rgba(0,0,0,0.8)',\n shadowBlur: 8,\n shadowOffsetX: 0,\n shadowOffsetY: 2,\n uppercase: false,\n wordHighlight: false,\n wordHighlightColor: '#FFFFFF',\n wordHighlightTextColor: '#000000',\n },\n bold: {\n preset: 'bold',\n fontFamily: '\"Arial Black\", \"Helvetica Neue\", Arial, sans-serif',\n fontSize: 56,\n fontWeight: '900',\n color: '#FFFF00',\n strokeColor: '#000000',\n strokeWidth: 5,\n backgroundColor: 'transparent',\n backgroundPadding: 0,\n backgroundRadius: 0,\n position: 'center',\n textAlign: 'center',\n lineHeight: 1.2,\n maxWidth: 0.88,\n shadow: true,\n shadowColor: 'rgba(0,0,0,1)',\n shadowBlur: 4,\n shadowOffsetX: 3,\n shadowOffsetY: 3,\n uppercase: true,\n wordHighlight: false,\n wordHighlightColor: '#FF0000',\n wordHighlightTextColor: '#FFFFFF',\n },\n};\n\nexport function mergeStyle(\n base: CaptionStyle,\n overrides?: Partial<CaptionStyle>\n): CaptionStyle {\n return overrides ? { ...base, ...overrides } : base;\n}\n\nexport function getActiveCaptions(\n segments: CaptionSegment[],\n currentTime: number\n): CaptionSegment[] {\n return segments.filter(\n (seg) => currentTime >= seg.startTime && currentTime < seg.endTime\n );\n}\n\nfunction wrapText(\n ctx: CanvasRenderingContext2D,\n text: string,\n maxWidth: number\n): string[] {\n const words = text.split(' ');\n const lines: string[] = [];\n let current = '';\n\n for (const word of words) {\n const test = current ? `${current} ${word}` : word;\n if (ctx.measureText(test).width > maxWidth && current) {\n lines.push(current);\n current = word;\n } else {\n current = test;\n }\n }\n if (current) lines.push(current);\n return lines;\n}\n\nexport function renderCaption(\n ctx: CanvasRenderingContext2D,\n segment: CaptionSegment,\n resolvedStyle: CaptionStyle,\n canvasWidth: number,\n canvasHeight: number\n): void {\n const style = resolvedStyle;\n const text = style.uppercase ? segment.text.toUpperCase() : segment.text;\n\n ctx.save();\n\n const scaledFontSize = (style.fontSize / 1080) * canvasHeight;\n ctx.font = `${style.fontWeight} ${scaledFontSize}px ${style.fontFamily}`;\n ctx.textAlign = style.textAlign;\n ctx.textBaseline = 'bottom';\n\n const maxPx = style.maxWidth * canvasWidth;\n const lines = wrapText(ctx, text, maxPx);\n const lineH = scaledFontSize * style.lineHeight;\n const totalH = lines.length * lineH;\n\n let baseY: number;\n if (style.position === 'top') {\n baseY = scaledFontSize * 1.5;\n } else if (style.position === 'center') {\n baseY = canvasHeight / 2 - totalH / 2 + lineH;\n } else {\n baseY = canvasHeight - scaledFontSize * 1.2;\n }\n\n const cx = canvasWidth / 2;\n\n lines.forEach((line, i) => {\n const y = baseY + i * lineH;\n\n // Background box\n if (style.backgroundColor && style.backgroundColor !== 'transparent') {\n const metrics = ctx.measureText(line);\n const bw = metrics.width + style.backgroundPadding * 2;\n const bh = lineH + style.backgroundPadding;\n const bx = cx - bw / 2;\n const by = y - lineH;\n\n ctx.fillStyle = style.backgroundColor;\n if (style.backgroundRadius > 0) {\n roundRect(ctx, bx, by, bw, bh, style.backgroundRadius);\n ctx.fill();\n } else {\n ctx.fillRect(bx, by, bw, bh);\n }\n }\n\n // Shadow\n if (style.shadow) {\n ctx.shadowColor = style.shadowColor;\n ctx.shadowBlur = style.shadowBlur;\n ctx.shadowOffsetX = style.shadowOffsetX;\n ctx.shadowOffsetY = style.shadowOffsetY;\n }\n\n // Stroke\n if (style.strokeWidth > 0 && style.strokeColor !== 'transparent') {\n ctx.lineWidth = style.strokeWidth;\n ctx.strokeStyle = style.strokeColor;\n ctx.strokeText(line, cx, y);\n }\n\n // Fill\n ctx.shadowColor = 'transparent';\n ctx.shadowBlur = 0;\n ctx.fillStyle = style.color;\n ctx.fillText(line, cx, y);\n });\n\n ctx.restore();\n}\n\nfunction roundRect(\n ctx: CanvasRenderingContext2D,\n x: number,\n y: number,\n w: number,\n h: number,\n r: number\n): void {\n ctx.beginPath();\n ctx.moveTo(x + r, y);\n ctx.lineTo(x + w - r, y);\n ctx.quadraticCurveTo(x + w, y, x + w, y + r);\n ctx.lineTo(x + w, y + h - r);\n ctx.quadraticCurveTo(x + w, y + h, x + w - r, y + h);\n ctx.lineTo(x + r, y + h);\n ctx.quadraticCurveTo(x, y + h, x, y + h - r);\n ctx.lineTo(x, y + r);\n ctx.quadraticCurveTo(x, y, x + r, y);\n ctx.closePath();\n}\n","export type {\n ClipInput,\n CaptionSegment,\n CaptionStyle,\n CaptionStylePreset,\n AspectRatio,\n CropOptions,\n CaptionOptions,\n RenderOptions,\n EncodeOptions,\n FrameData,\n RendererBackend,\n FrameWorkerConfig,\n FrameWorker,\n ClipStatus,\n ClipProgress,\n RichProgress,\n StitchOptions,\n ClipMetrics,\n RenderMetrics,\n Segment,\n SingleVideoRenderOptions,\n} from './types.js';\n\nexport { STYLE_PRESETS } from './captions.js';\nexport { FFmpegBackend, createFFmpegBackend } from './backends/ffmpeg.js';\nexport { render, renderToUrl } from './render.js';\n\nimport type { ClipInput, RenderOptions, StitchOptions, RenderMetrics, FrameWorkerConfig, FrameWorker, RendererBackend } from './types.js';\nimport { extractFrames } from './compositor.js';\nimport { stitchClips } from './stitch.js';\n\nexport function createFrameWorker(config: FrameWorkerConfig = {}): FrameWorker {\n const fps = config.fps ?? 30;\n const width = config.width ?? 1280;\n const height = config.height ?? 720;\n\n let _backend: RendererBackend | null = config.backend ?? null;\n\n async function getBackend(): Promise<RendererBackend> {\n if (!_backend) {\n const { createFFmpegBackend } = await import('./backends/ffmpeg.js');\n _backend = createFFmpegBackend();\n }\n await _backend.init();\n return _backend;\n }\n\n async function render(clip: ClipInput, options: RenderOptions = {}): Promise<Blob> {\n const mergedOpts: RenderOptions = { fps, width, height, ...options };\n const backend = await getBackend();\n\n const onProgress = mergedOpts.onProgress;\n const frames = await extractFrames(clip, {\n ...mergedOpts,\n onProgress: onProgress ? (p) => onProgress(p * 0.85) : undefined,\n });\n\n return backend.encode(frames, {\n width: mergedOpts.width ?? width,\n height: mergedOpts.height ?? height,\n fps: mergedOpts.fps ?? fps,\n mimeType: mergedOpts.mimeType ?? 'video/mp4',\n quality: mergedOpts.quality ?? 0.92,\n encoderOptions: mergedOpts.encoderOptions,\n onProgress: onProgress ? (p) => onProgress(0.85 + p * 0.15) : undefined,\n signal: mergedOpts.signal,\n });\n }\n\n async function renderToUrl(clip: ClipInput, options?: RenderOptions): Promise<string> {\n const blob = await render(clip, options);\n return URL.createObjectURL(blob);\n }\n\n async function stitch(clips: ClipInput[], options: StitchOptions = {}): Promise<{ blob: Blob; metrics: RenderMetrics }> {\n const mergedOpts: StitchOptions = { fps, width, height, ...options };\n const backend = await getBackend();\n return stitchClips(clips, backend, mergedOpts);\n }\n\n async function stitchToUrl(clips: ClipInput[], options?: StitchOptions): Promise<{ url: string; metrics: RenderMetrics }> {\n const { blob, metrics } = await stitch(clips, options);\n return { url: URL.createObjectURL(blob), metrics };\n }\n\n return { render, renderToUrl, stitch, stitchToUrl };\n}\n","import type { ClipInput, FrameData, RenderOptions } from './types.js';\nimport { STYLE_PRESETS, mergeStyle, getActiveCaptions, renderCaption } from './captions.js';\n\nconst ASPECT_RATIO_MAP: Record<string, [number, number]> = {\n '16:9': [16, 9],\n '9:16': [9, 16],\n '1:1': [1, 1],\n '4:3': [4, 3],\n '3:4': [3, 4],\n original: [0, 0],\n};\n\nfunction resolveOutputDimensions(\n clip: ClipInput,\n videoWidth: number,\n videoHeight: number,\n options: RenderOptions\n): [number, number] {\n const ar = clip.aspectRatio ?? 'original';\n const ratio = ASPECT_RATIO_MAP[ar] ?? [0, 0];\n\n if (ratio[0] === 0) {\n return [options.width ?? videoWidth, options.height ?? videoHeight];\n }\n\n const w = options.width ?? 1280;\n const h = Math.round(w * (ratio[1] / ratio[0]));\n return [w, h];\n}\n\nexport async function extractFrames(\n clip: ClipInput,\n options: RenderOptions\n): Promise<FrameData[]> {\n const fps = options.fps ?? 30;\n const onProgress = options.onProgress;\n const signal = options.signal;\n\n let srcUrl: string;\n let needsRevoke = false;\n\n if (typeof clip.source === 'string') {\n srcUrl = clip.source;\n } else if (clip.source instanceof HTMLVideoElement) {\n srcUrl = clip.source.src;\n } else {\n srcUrl = URL.createObjectURL(clip.source as Blob);\n needsRevoke = true;\n }\n\n const video = document.createElement('video');\n video.muted = true;\n video.crossOrigin = 'anonymous';\n video.preload = 'auto';\n\n await new Promise<void>((resolve, reject) => {\n video.onloadedmetadata = () => resolve();\n video.onerror = () => reject(new Error(`Failed to load video: ${srcUrl}`));\n video.src = srcUrl;\n });\n\n const duration = video.duration;\n const startTime = clip.startTime ?? 0;\n const endTime = clip.endTime ?? duration;\n const clipDuration = endTime - startTime;\n\n const [outW, outH] = resolveOutputDimensions(\n clip,\n video.videoWidth,\n video.videoHeight,\n options\n );\n\n const canvas = document.createElement('canvas');\n canvas.width = outW;\n canvas.height = outH;\n const ctx = canvas.getContext('2d', { willReadFrequently: true })!;\n\n const totalFrames = Math.ceil(clipDuration * fps);\n const frames: FrameData[] = [];\n\n const captionSegments = clip.captions?.segments ?? [];\n const baseStylePreset = clip.captions?.style?.preset ?? 'modern';\n const baseStyle = mergeStyle(\n STYLE_PRESETS[baseStylePreset],\n clip.captions?.style\n );\n\n for (let i = 0; i < totalFrames; i++) {\n if (signal?.aborted) throw new DOMException('Render cancelled', 'AbortError');\n\n const t = startTime + (i / fps);\n\n await seekVideo(video, t);\n ctx.clearRect(0, 0, outW, outH);\n\n drawVideoFrame(ctx, video, clip, outW, outH);\n\n if (captionSegments.length > 0) {\n const active = getActiveCaptions(captionSegments, t - startTime);\n for (const seg of active) {\n const segStyle = mergeStyle(baseStyle, seg.style);\n renderCaption(ctx, seg, segStyle, outW, outH);\n }\n }\n\n const imageData = ctx.getImageData(0, 0, outW, outH);\n frames.push({ imageData, timestamp: t - startTime, width: outW, height: outH });\n\n if (onProgress) onProgress(i / totalFrames);\n }\n\n if (needsRevoke) URL.revokeObjectURL(srcUrl);\n\n return frames;\n}\n\nfunction drawVideoFrame(\n ctx: CanvasRenderingContext2D,\n video: HTMLVideoElement,\n clip: ClipInput,\n outW: number,\n outH: number\n): void {\n const vw = video.videoWidth;\n const vh = video.videoHeight;\n\n if (clip.crop) {\n const { x, y, width, height } = clip.crop;\n ctx.drawImage(\n video,\n x * vw, y * vh, width * vw, height * vh,\n 0, 0, outW, outH\n );\n } else {\n const videoAR = vw / vh;\n const outAR = outW / outH;\n\n let sx = 0, sy = 0, sw = vw, sh = vh;\n if (videoAR > outAR) {\n sw = vh * outAR;\n sx = (vw - sw) / 2;\n } else if (videoAR < outAR) {\n sh = vw / outAR;\n sy = (vh - sh) / 2;\n }\n ctx.drawImage(video, sx, sy, sw, sh, 0, 0, outW, outH);\n }\n}\n\nfunction seekVideo(video: HTMLVideoElement, time: number): Promise<void> {\n return new Promise((resolve) => {\n if (Math.abs(video.currentTime - time) < 0.001) {\n resolve();\n return;\n }\n const onSeeked = () => {\n video.removeEventListener('seeked', onSeeked);\n resolve();\n };\n video.addEventListener('seeked', onSeeked);\n video.currentTime = time;\n });\n}\n","import type { ClipInput, FrameData } from '../types.js';\nimport type { WorkerInbound, WorkerOutbound, TransferableFrame } from './protocol.js';\n\nconst ASPECT_RATIO_MAP: Record<string, [number, number]> = {\n '16:9': [16, 9],\n '9:16': [9, 16],\n '1:1': [1, 1],\n '4:3': [4, 3],\n '3:4': [3, 4],\n original: [0, 0],\n};\n\nfunction resolveOutputDimensions(\n clip: ClipInput,\n videoWidth: number,\n videoHeight: number,\n width: number,\n height: number\n): [number, number] {\n const ar = clip.aspectRatio ?? 'original';\n const ratio = ASPECT_RATIO_MAP[ar] ?? [0, 0];\n if (ratio[0] === 0) return [width, height];\n const w = width;\n const h = Math.round(w * (ratio[1] / ratio[0]));\n return [w, h];\n}\n\nfunction seekVideo(video: HTMLVideoElement, time: number): Promise<void> {\n return new Promise((resolve) => {\n if (Math.abs(video.currentTime - time) < 0.001) { resolve(); return; }\n const onSeeked = () => { video.removeEventListener('seeked', onSeeked); resolve(); };\n video.addEventListener('seeked', onSeeked);\n video.currentTime = time;\n });\n}\n\nfunction drawVideoFrame(\n ctx: CanvasRenderingContext2D,\n video: HTMLVideoElement,\n clip: ClipInput,\n outW: number,\n outH: number\n): void {\n const vw = video.videoWidth;\n const vh = video.videoHeight;\n\n if (clip.crop) {\n const { x, y, width, height } = clip.crop;\n ctx.drawImage(video, x * vw, y * vh, width * vw, height * vh, 0, 0, outW, outH);\n } else {\n const videoAR = vw / vh;\n const outAR = outW / outH;\n let sx = 0, sy = 0, sw = vw, sh = vh;\n if (videoAR > outAR) {\n sw = vh * outAR;\n sx = (vw - sw) / 2;\n } else if (videoAR < outAR) {\n sh = vw / outAR;\n sy = (vh - sh) / 2;\n }\n ctx.drawImage(video, sx, sy, sw, sh, 0, 0, outW, outH);\n }\n}\n\nexport class WorkerPool {\n private readonly workers: Worker[] = [];\n private readonly available: Worker[] = [];\n private readonly waiters: Array<(w: Worker) => void> = [];\n\n constructor(maxConcurrency: number) {\n for (let i = 0; i < maxConcurrency; i++) {\n const w = new Worker(new URL('./worker/render-worker.js', import.meta.url), { type: 'module' });\n this.workers.push(w);\n this.available.push(w);\n }\n }\n\n private acquire(): Promise<Worker> {\n if (this.available.length > 0) return Promise.resolve(this.available.pop()!);\n return new Promise(resolve => this.waiters.push(resolve));\n }\n\n private release(worker: Worker): void {\n if (this.waiters.length > 0) {\n this.waiters.shift()!(worker);\n } else {\n this.available.push(worker);\n }\n }\n\n async dispatch(\n clip: ClipInput,\n width: number,\n height: number,\n fps: number,\n signal?: AbortSignal,\n onProgress?: (p: number) => void\n ): Promise<FrameData[]> {\n const worker = await this.acquire();\n try {\n return await this.processClip(worker, clip, width, height, fps, signal, onProgress);\n } finally {\n this.release(worker);\n }\n }\n\n private async processClip(\n worker: Worker,\n clip: ClipInput,\n width: number,\n height: number,\n fps: number,\n signal?: AbortSignal,\n onProgress?: (p: number) => void\n ): Promise<FrameData[]> {\n let srcUrl: string;\n let needsRevoke = false;\n\n if (typeof clip.source === 'string') {\n srcUrl = clip.source;\n } else if (clip.source instanceof HTMLVideoElement) {\n srcUrl = clip.source.src;\n } else {\n srcUrl = URL.createObjectURL(clip.source as Blob);\n needsRevoke = true;\n }\n\n const video = document.createElement('video');\n video.muted = true;\n video.crossOrigin = 'anonymous';\n video.preload = 'auto';\n\n await new Promise<void>((resolve, reject) => {\n video.onloadedmetadata = () => resolve();\n video.onerror = () => reject(new Error(`Failed to load video: ${srcUrl}`));\n video.src = srcUrl;\n });\n\n const duration = video.duration;\n const startTime = clip.startTime ?? 0;\n const endTime = clip.endTime ?? duration;\n const clipDuration = endTime - startTime;\n const [outW, outH] = resolveOutputDimensions(clip, video.videoWidth, video.videoHeight, width, height);\n const totalFrames = Math.ceil(clipDuration * fps);\n\n // Temp canvas applies crop/aspect-ratio before handing bitmap to worker\n const canvas = document.createElement('canvas');\n canvas.width = outW;\n canvas.height = outH;\n const ctx = canvas.getContext('2d')!;\n\n // Wire up worker message handler before sending init\n const resultPromise = new Promise<TransferableFrame[]>((resolve, reject) => {\n const onMessage = (e: MessageEvent<WorkerOutbound>) => {\n const msg = e.data;\n if (msg.type === 'done') {\n worker.removeEventListener('message', onMessage);\n resolve(msg.frames);\n } else if (msg.type === 'error') {\n worker.removeEventListener('message', onMessage);\n reject(new Error(msg.message));\n } else if (msg.type === 'progress') {\n onProgress?.(msg.value);\n }\n };\n worker.addEventListener('message', onMessage);\n });\n\n const initMsg: WorkerInbound = {\n type: 'init',\n meta: { width: outW, height: outH, fps, captions: clip.captions, totalFrames },\n };\n worker.postMessage(initMsg);\n\n try {\n for (let i = 0; i < totalFrames; i++) {\n if (signal?.aborted) {\n worker.postMessage({ type: 'abort' } satisfies WorkerInbound);\n throw new DOMException('Render cancelled', 'AbortError');\n }\n\n const t = startTime + (i / fps);\n await seekVideo(video, t);\n ctx.clearRect(0, 0, outW, outH);\n drawVideoFrame(ctx, video, clip, outW, outH);\n\n const bitmap = await createImageBitmap(canvas);\n const frameMsg: WorkerInbound = { type: 'frame', bitmap, timestamp: t - startTime, index: i };\n worker.postMessage(frameMsg, [bitmap]);\n }\n\n worker.postMessage({ type: 'end' } satisfies WorkerInbound);\n const transferableFrames = await resultPromise;\n\n return transferableFrames.map(f => ({\n imageData: new ImageData(new Uint8ClampedArray(f.buffer), f.width, f.height),\n timestamp: f.timestamp,\n width: f.width,\n height: f.height,\n }));\n } finally {\n if (needsRevoke) URL.revokeObjectURL(srcUrl);\n }\n }\n\n terminate(): void {\n for (const w of this.workers) w.terminate();\n this.workers.length = 0;\n this.available.length = 0;\n }\n}\n","import type { ClipInput, RendererBackend, FrameData, ClipProgress, StitchOptions, ClipMetrics, RenderMetrics } from './types.js';\nimport { extractFrames } from './compositor.js';\nimport { WorkerPool } from './worker/pool.js';\n\nfunction supportsOffscreenWorkers(): boolean {\n return (\n typeof Worker !== 'undefined' &&\n typeof OffscreenCanvas !== 'undefined' &&\n typeof createImageBitmap !== 'undefined'\n );\n}\n\nexport async function stitchClips(\n clips: ClipInput[],\n backend: RendererBackend,\n options: StitchOptions\n): Promise<{ blob: Blob; metrics: RenderMetrics }> {\n if (supportsOffscreenWorkers() && clips.length > 1) {\n return stitchParallel(clips, backend, options);\n }\n return stitchSequential(clips, backend, options);\n}\n\n// ── Sequential fallback (older browsers / single clip) ────────────────────────\n\nasync function stitchSequential(\n clips: ClipInput[],\n backend: RendererBackend,\n options: StitchOptions\n): Promise<{ blob: Blob; metrics: RenderMetrics }> {\n const fps = options.fps ?? 30;\n const width = options.width ?? 1280;\n const height = options.height ?? 720;\n const { onProgress, onComplete, signal } = options;\n\n const stitchStart = performance.now();\n\n const clipStatuses: ClipProgress[] = clips.map((_, i) => ({\n index: i, status: 'pending', progress: 0,\n }));\n const clipMetrics: ClipMetrics[] = [];\n\n const emit = (overall: number) => {\n onProgress?.({ overall, clips: clipStatuses.slice() });\n };\n\n const blobs: Blob[] = [];\n\n for (let ci = 0; ci < clips.length; ci++) {\n clipStatuses[ci].status = 'rendering';\n emit(ci / clips.length);\n\n const extractStart = performance.now();\n const frames = await extractFrames(clips[ci], {\n fps, width, height,\n mimeType: options.mimeType,\n quality: options.quality,\n encoderOptions: options.encoderOptions,\n signal,\n onProgress: (p) => {\n clipStatuses[ci].progress = p * 0.9;\n emit((ci + p * 0.9) / clips.length);\n },\n });\n const extractionMs = performance.now() - extractStart;\n\n clipStatuses[ci].status = 'encoding';\n const encodeStart = performance.now();\n const blob = await backend.encode(frames, {\n width, height, fps,\n mimeType: options.mimeType ?? 'video/mp4',\n quality: options.quality ?? 0.92,\n encoderOptions: options.encoderOptions,\n signal,\n onProgress: (p) => {\n clipStatuses[ci].progress = 0.9 + p * 0.1;\n emit((ci + 0.9 + p * 0.1) / clips.length);\n },\n });\n const encodingMs = performance.now() - encodeStart;\n\n clipStatuses[ci].status = 'done';\n clipStatuses[ci].progress = 1;\n clipMetrics.push({\n clipId: String(ci),\n extractionMs,\n encodingMs,\n totalMs: extractionMs + encodingMs,\n framesExtracted: frames.length,\n });\n blobs.push(blob);\n }\n\n let finalBlob: Blob;\n let stitchMs = 0;\n\n if (blobs.length === 1) {\n emit(1);\n finalBlob = blobs[0];\n } else {\n const stitchPhaseStart = performance.now();\n finalBlob = await backend.concat(blobs, {\n width, height, fps,\n mimeType: options.mimeType ?? 'video/mp4',\n quality: options.quality ?? 0.92,\n signal,\n onProgress: (p) => emit((clips.length - 1 + p) / clips.length),\n });\n stitchMs = performance.now() - stitchPhaseStart;\n }\n\n const totalMs = performance.now() - stitchStart;\n const totalFrames = clipMetrics.reduce((s, c) => s + c.framesExtracted, 0);\n const metrics: RenderMetrics = {\n totalMs,\n extractionMs: clipMetrics.reduce((s, c) => s + c.extractionMs, 0),\n encodingMs: clipMetrics.reduce((s, c) => s + c.encodingMs, 0),\n stitchMs,\n clips: clipMetrics,\n framesPerSecond: totalFrames / (totalMs / 1000),\n };\n\n onComplete?.(metrics);\n return { blob: finalBlob, metrics };\n}\n\n// ── Parallel path (OffscreenCanvas + WorkerPool) ──────────────────────────────\n\nasync function stitchParallel(\n clips: ClipInput[],\n backend: RendererBackend,\n options: StitchOptions\n): Promise<{ blob: Blob; metrics: RenderMetrics }> {\n const fps = options.fps ?? 30;\n const width = options.width ?? 1280;\n const height = options.height ?? 720;\n const { onProgress, onComplete, signal } = options;\n\n const stitchStart = performance.now();\n\n const concurrency = Math.min(\n clips.length,\n (typeof navigator !== 'undefined' ? navigator.hardwareConcurrency || 2 : 2),\n 4\n );\n\n const clipStatuses: ClipProgress[] = clips.map((_, i) => ({\n index: i, status: 'pending', progress: 0,\n }));\n const clipMetrics: Array<ClipMetrics> = new Array(clips.length);\n\n const emit = () => {\n const overall = clipStatuses.reduce((sum, c) => sum + c.progress, 0) / clips.length;\n onProgress?.({ overall, clips: clipStatuses.slice() });\n };\n\n const pool = new WorkerPool(concurrency);\n const blobs: Blob[] = new Array(clips.length);\n let encodeChain = Promise.resolve();\n\n try {\n await Promise.all(\n clips.map(async (clip, ci) => {\n clipStatuses[ci].status = 'rendering';\n emit();\n\n const extractStart = performance.now();\n const frames: FrameData[] = await pool.dispatch(\n clip, width, height, fps, signal,\n (p) => {\n clipStatuses[ci].progress = p * 0.85;\n emit();\n }\n );\n const extractionMs = performance.now() - extractStart;\n\n clipStatuses[ci].status = 'encoding';\n clipStatuses[ci].progress = 0.85;\n emit();\n\n await new Promise<void>((resolve, reject) => {\n encodeChain = encodeChain.then(async () => {\n const encodeStart = performance.now();\n try {\n blobs[ci] = await backend.encode(frames, {\n width, height, fps,\n mimeType: options.mimeType ?? 'video/mp4',\n quality: options.quality ?? 0.92,\n encoderOptions: options.encoderOptions,\n signal,\n onProgress: (p) => {\n clipStatuses[ci].progress = 0.85 + p * 0.15;\n emit();\n },\n });\n const encodingMs = performance.now() - encodeStart;\n clipMetrics[ci] = {\n clipId: String(ci),\n extractionMs,\n encodingMs,\n totalMs: extractionMs + encodingMs,\n framesExtracted: frames.length,\n };\n clipStatuses[ci].status = 'done';\n clipStatuses[ci].progress = 1;\n emit();\n resolve();\n } catch (err) {\n clipStatuses[ci].status = 'error';\n reject(err);\n throw err;\n }\n });\n });\n })\n );\n\n let finalBlob: Blob;\n let stitchMs = 0;\n\n if (blobs.length === 1) {\n onProgress?.({ overall: 1, clips: clipStatuses.slice() });\n finalBlob = blobs[0];\n } else {\n const stitchPhaseStart = performance.now();\n finalBlob = await backend.concat(blobs, {\n width, height, fps,\n mimeType: options.mimeType ?? 'video/mp4',\n quality: options.quality ?? 0.92,\n signal,\n });\n stitchMs = performance.now() - stitchPhaseStart;\n }\n\n const totalMs = performance.now() - stitchStart;\n const totalFrames = clipMetrics.reduce((s, c) => s + c.framesExtracted, 0);\n const metrics: RenderMetrics = {\n totalMs,\n extractionMs: clipMetrics.reduce((s, c) => s + c.extractionMs, 0),\n encodingMs: clipMetrics.reduce((s, c) => s + c.encodingMs, 0),\n stitchMs,\n clips: clipMetrics,\n framesPerSecond: totalFrames / (totalMs / 1000),\n };\n\n onComplete?.(metrics);\n return { blob: finalBlob, metrics };\n } finally {\n pool.terminate();\n }\n}\n","import type { Segment, SingleVideoRenderOptions, RenderMetrics, ClipInput } from './types.js';\nimport { stitchClips } from './stitch.js';\nimport { createFFmpegBackend } from './backends/ffmpeg.js';\n\nfunction segmentsToClips(videoUrl: string, segments: Segment[]): ClipInput[] {\n return segments.map((seg) => ({\n source: videoUrl,\n startTime: seg.start,\n endTime: seg.end,\n captions: seg.captions?.length ? { segments: seg.captions } : undefined,\n }));\n}\n\nexport async function render(\n videoUrl: string,\n segments: Segment[],\n options?: SingleVideoRenderOptions\n): Promise<{ blob: Blob; metrics: RenderMetrics }> {\n const clips = segmentsToClips(videoUrl, segments);\n const backend = createFFmpegBackend();\n await backend.init();\n return stitchClips(clips, backend, options ?? {});\n}\n\nexport async function renderToUrl(\n videoUrl: string,\n segments: Segment[],\n options?: SingleVideoRenderOptions\n): Promise<{ url: string; metrics: RenderMetrics }> {\n const { blob, metrics } = await render(videoUrl, segments, options);\n return { url: URL.createObjectURL(blob), metrics };\n}\n"]}
package/dist/index.js CHANGED
@@ -525,7 +525,7 @@ var WorkerPool = class {
525
525
  this.available = [];
526
526
  this.waiters = [];
527
527
  for (let i = 0; i < maxConcurrency; i++) {
528
- const w = new Worker(new URL("./render-worker.js", import.meta.url), { type: "module" });
528
+ const w = new Worker(new URL("./worker/render-worker.js", import.meta.url), { type: "module" });
529
529
  this.workers.push(w);
530
530
  this.available.push(w);
531
531
  }