Skip to content

Commit c11f715

Browse files
Merge pull request #1034 from heygen-com/fix/retrocompat-fps-input
fix(producer): accept plain integer fps in createRenderJob
2 parents 6c191e2 + 2158113 commit c11f715

6 files changed

Lines changed: 26 additions & 14 deletions

File tree

docs/packages/engine.mdx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ import {
9696
} from '@hyperframes/engine';
9797

9898
// 1. Create a capture session
99-
const session = await createCaptureSession({ fps: 30, width: 1920, height: 1080 });
99+
const session = await createCaptureSession({ fps: { num: 30, den: 1 }, width: 1920, height: 1080 });
100100

101101
// 2. Initialize with a composition
102102
await initializeSession(session, './my-video/index.html');
@@ -163,7 +163,7 @@ const webmPreset = getEncoderPreset('standard', 'webm');
163163

164164
// Encode captured frames to video
165165
await encodeFramesFromDir(framesDir, 'frame_%06d.png', outputPath, {
166-
fps: 30,
166+
fps: { num: 30, den: 1 },
167167
...webmPreset,
168168
});
169169

@@ -195,7 +195,7 @@ import { spawnStreamingEncoder } from '@hyperframes/engine';
195195

196196
const encoder = await spawnStreamingEncoder({
197197
outputPath: './output.mp4',
198-
fps: 30,
198+
fps: { num: 30, den: 1 },
199199
width: 1920,
200200
height: 1080,
201201
});

docs/packages/producer.mdx

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -60,28 +60,26 @@ The producer uses a two-step API: create a render job configuration, then execut
6060
import { createRenderJob, executeRenderJob } from '@hyperframes/producer';
6161

6262
const job = createRenderJob({
63-
input: './my-video/index.html',
64-
output: './output.mp4',
6563
fps: 30,
6664
quality: 'standard',
6765
});
6866

69-
const result = await executeRenderJob(job);
67+
await executeRenderJob(job, './my-video', './output.mp4');
7068
```
7169

7270
### Render Configuration
7371

7472
```typescript
75-
import type { RenderConfig } from '@hyperframes/producer';
73+
import { createRenderJob } from '@hyperframes/producer';
7674

77-
const config: RenderConfig = {
78-
fps: 30, // 24, 30, or 60
75+
const job = createRenderJob({
76+
fps: 30, // integer, or { num: 30000, den: 1001 } for NTSC
7977
quality: 'standard', // 'draft', 'standard', or 'high'
80-
format: 'mp4', // 'mp4' or 'webm' (WebM renders with transparency)
78+
format: 'mp4', // 'mp4', 'webm', 'mov', or 'png-sequence'
8179
workers: 4, // Parallel render workers (1-8)
8280
useGpu: false, // GPU-accelerated encoding
8381
debug: false, // Debug logging
84-
};
82+
});
8583
```
8684

8785
#### WebM with Transparency

packages/core/src/core.types.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,15 @@ export interface Fps {
2020
den: number;
2121
}
2222

23+
export type FpsInput = number | Fps;
24+
25+
export function toFps(input: FpsInput): Fps {
26+
if (typeof input === "number") {
27+
return { num: input, den: 1 };
28+
}
29+
return input;
30+
}
31+
2332
/**
2433
* Decimal value of an {@link Fps} rational. Used at sites that need a
2534
* `number` for arithmetic (frame-index → time, frame intervals, telemetry

packages/core/src/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ export type {
1212
MediaElementType,
1313
CanvasResolution,
1414
Fps,
15+
FpsInput,
1516
FpsParseResult,
1617
MediaFile,
1718
CompositionAPI,
@@ -42,6 +43,7 @@ export {
4243
normalizeResolutionFlag,
4344
parseFps,
4445
parseFpsWithDefault,
46+
toFps,
4547
fpsToNumber,
4648
fpsToFfmpegArg,
4749
TIMELINE_COLORS,

packages/producer/src/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ export {
1212
executeRenderJob,
1313
RenderCancelledError,
1414
type RenderConfig,
15+
type RenderConfigInput,
1516
type RenderJob,
1617
type RenderStatus,
1718
type RenderPerfSummary,

packages/producer/src/services/renderOrchestrator.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ import {
4444
appendFileSync,
4545
} from "fs";
4646
import { parseHTML } from "linkedom";
47-
import { type CanvasResolution, type Fps } from "@hyperframes/core";
47+
import { type CanvasResolution, type Fps, type FpsInput, toFps } from "@hyperframes/core";
4848
import {
4949
type EngineConfig,
5050
resolveConfig,
@@ -1343,10 +1343,12 @@ export async function compositeHdrFrame(
13431343
}
13441344
}
13451345

1346-
export function createRenderJob(config: RenderConfig): RenderJob {
1346+
export type RenderConfigInput = Omit<RenderConfig, "fps"> & { fps: FpsInput };
1347+
1348+
export function createRenderJob(config: RenderConfigInput): RenderJob {
13471349
return {
13481350
id: randomUUID(),
1349-
config,
1351+
config: { ...config, fps: toFps(config.fps) },
13501352
status: "queued",
13511353
progress: 0,
13521354
currentStage: "Queued",

0 commit comments

Comments
 (0)