@@ -84,7 +84,7 @@ interface RenderInput {
8484 quality : "draft" | "standard" | "high" ;
8585 format ?: "mp4" | "webm" | "mov" ;
8686 videoFrameFormat ?: RenderConfig [ "videoFrameFormat" ] ;
87- hdrMode ?: RenderConfig [ "hdrMode" ] ;
87+ outputDynamicRange ?: "auto" | "hdr" | "sdr" ;
8888 workers ?: number ;
8989 useGpu : boolean ;
9090 debug : boolean ;
@@ -159,10 +159,28 @@ function parseServerFormat(value: unknown): RenderInput["format"] {
159159 return value === "mp4" || value === "webm" || value === "mov" ? value : undefined ;
160160}
161161
162- function parseServerHdrMode ( value : unknown ) : RenderInput [ "hdrMode" ] {
162+ function parseServerOutputDynamicRange ( value : unknown ) : RenderInput [ "outputDynamicRange" ] {
163+ return value === "auto" || value === "hdr" || value === "sdr" ? value : undefined ;
164+ }
165+
166+ function parseLegacyServerHdrMode ( value : unknown ) : RenderConfig [ "hdrMode" ] {
163167 return value === "auto" || value === "force-hdr" || value === "force-sdr" ? value : undefined ;
164168}
165169
170+ function fromRenderHdrMode ( hdrMode : RenderConfig [ "hdrMode" ] ) : RenderInput [ "outputDynamicRange" ] {
171+ if ( hdrMode === "force-hdr" ) return "hdr" ;
172+ if ( hdrMode === "force-sdr" ) return "sdr" ;
173+ return hdrMode ;
174+ }
175+
176+ function toRenderHdrMode (
177+ outputDynamicRange : RenderInput [ "outputDynamicRange" ] ,
178+ ) : RenderConfig [ "hdrMode" ] {
179+ if ( outputDynamicRange === "hdr" ) return "force-hdr" ;
180+ if ( outputDynamicRange === "sdr" ) return "force-sdr" ;
181+ return outputDynamicRange ;
182+ }
183+
166184export function parseRenderOptions ( body : Record < string , unknown > ) : Omit < RenderInput , "projectDir" > {
167185 // Accept either a JSON `number` (integer fps) or a JSON `string` (rational
168186 // like "30000/1001"). Falls back to 30 fps on parse failure to preserve the
@@ -181,7 +199,9 @@ export function parseRenderOptions(body: Record<string, unknown>): Omit<RenderIn
181199 const outputPath = parseOutputCandidate ( body ) ;
182200 const entryFile = nonEmptyString ( body . entryFile ) ;
183201 const format = parseServerFormat ( body . format ) ;
184- const hdrMode = parseServerHdrMode ( body . hdrMode ) ;
202+ const outputDynamicRange =
203+ parseServerOutputDynamicRange ( body . outputDynamicRange ) ??
204+ fromRenderHdrMode ( parseLegacyServerHdrMode ( body . hdrMode ) ) ;
185205 const videoFrameFormat = isVideoFrameFormat ( body . videoFrameFormat )
186206 ? body . videoFrameFormat
187207 : undefined ;
@@ -199,7 +219,7 @@ export function parseRenderOptions(body: Record<string, unknown>): Omit<RenderIn
199219 strictness,
200220 entryFile,
201221 format,
202- hdrMode ,
222+ outputDynamicRange ,
203223 variables,
204224 outputResolution,
205225 outputResolutionAspectAgnostic,
@@ -261,7 +281,7 @@ function buildRenderJobConfig(input: RenderInput, outputPath: string, log: Produ
261281 outputResolution : input . outputResolution ,
262282 outputResolutionAspectAgnostic : input . outputResolutionAspectAgnostic ,
263283 videoFrameFormat : input . videoFrameFormat ,
264- hdrMode : input . hdrMode ,
284+ hdrMode : toRenderHdrMode ( input . outputDynamicRange ) ,
265285 } ,
266286 } ) ;
267287 return renderConfigFromRequest ( request , { logger : log } ) ;
@@ -294,8 +314,23 @@ function validateRenderOverrides(body: Record<string, unknown>): string | undefi
294314 if ( body . variables !== undefined && ! isPlainObject ( body . variables ) ) {
295315 return 'variables must be a JSON object keyed by variable id (e.g. {"title":"Hello"})' ;
296316 }
297- if ( body . hdrMode !== undefined && parseServerHdrMode ( body . hdrMode ) === undefined ) {
298- return 'hdrMode must be one of: "auto", "force-hdr", "force-sdr"' ;
317+ if (
318+ body . outputDynamicRange !== undefined &&
319+ parseServerOutputDynamicRange ( body . outputDynamicRange ) === undefined
320+ ) {
321+ return 'outputDynamicRange must be one of: "auto", "hdr", "sdr"' ;
322+ }
323+ const legacyHdrMode = parseLegacyServerHdrMode ( body . hdrMode ) ;
324+ if ( body . hdrMode !== undefined && legacyHdrMode === undefined ) {
325+ return 'legacy hdrMode must be one of: "auto", "force-hdr", "force-sdr"' ;
326+ }
327+ const outputDynamicRange = parseServerOutputDynamicRange ( body . outputDynamicRange ) ;
328+ if (
329+ outputDynamicRange !== undefined &&
330+ legacyHdrMode !== undefined &&
331+ outputDynamicRange !== fromRenderHdrMode ( legacyHdrMode )
332+ ) {
333+ return "outputDynamicRange and legacy hdrMode must describe the same output policy" ;
299334 }
300335 return validateOutputResolutionOverride ( body ) ;
301336}
0 commit comments