From 9d91c2a23ee129add021fecea7e3e4d3cbab1f94 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miguel=20=C3=81ngel?= Date: Sat, 11 Jul 2026 18:32:48 -0400 Subject: [PATCH] fix(render): scale timeout for long video encodes (#2244) --- .../services/render/stages/encodeStage.test.ts | 18 ++++++++++++++++++ .../src/services/render/stages/encodeStage.ts | 14 ++++++++++++-- 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/packages/producer/src/services/render/stages/encodeStage.test.ts b/packages/producer/src/services/render/stages/encodeStage.test.ts index 728116f79..58df97ae6 100644 --- a/packages/producer/src/services/render/stages/encodeStage.test.ts +++ b/packages/producer/src/services/render/stages/encodeStage.test.ts @@ -154,6 +154,24 @@ describe("gif encode args", () => { }); describe("runEncodeStage config plumbing", () => { + it("scales the encode timeout for long compositions", async () => { + const { runEncodeStage } = await import("./encodeStage.js"); + + await runEncodeStage( + makeInput({ + job: { + ...makeInput().job, + duration: 754.8, + }, + engineConfig: { ffmpegEncodeTimeout: 600_000 }, + }), + ); + + expect(encodeFramesFromDirMock.mock.calls[0]?.[5]).toEqual({ + ffmpegEncodeTimeout: 3_019_200, + }); + }); + it("prefers engine config supplied by the orchestrator", async () => { const { runEncodeStage } = await import("./encodeStage.js"); const orchestratorEngineConfig = { ffmpegEncodeTimeout: 54_321 }; diff --git a/packages/producer/src/services/render/stages/encodeStage.ts b/packages/producer/src/services/render/stages/encodeStage.ts index 602a5a924..c66e4bedf 100644 --- a/packages/producer/src/services/render/stages/encodeStage.ts +++ b/packages/producer/src/services/render/stages/encodeStage.ts @@ -277,6 +277,16 @@ export async function runEncodeStage(input: EncodeStageInput): Promise engineCfg.ffmpegEncodeTimeout + ? { ...engineCfg, ffmpegEncodeTimeout: scaledEncodeTimeout } + : engineCfg; + const frameExt = needsAlpha ? "png" : "jpg"; const framePattern = `frame_%06d.${frameExt}`; const encoderOpts = { @@ -305,7 +315,7 @@ export async function runEncodeStage(input: EncodeStageInput): Promise