mirror of
https://github.com/heygen-com/hyperframes.git
synced 2026-09-03 04:38:33 +00:00
fix(cli): wire aspect-agnostic resolution through cloudrun/lambda/batch + preflight recompute
Addresses R2 CHANGES_REQUESTED from Miga + Rames on PR #2529: 1. Sibling-surface gap (blocker): `hyperframes cloudrun render{,-batch}`, `hyperframes lambda render{,-batch}` all advertised the same tier-only aliases (`1080p` / `hd` / `4k` / `uhd`) but normalized them to `landscape` and never set `outputResolutionAspectAgnostic`. The distributed plumbing PR #2529 added received `undefined` from those callers, so portrait `1080p` still hit the original aspect-mismatch on Cloud Run / Lambda. Fix: introduce `resolveResolutionFlagPair` in `@hyperframes/parsers` (the single source of truth for the two-step normalize + aspect-agnostic detect) and route every distributed entrypoint through a shared `parseOutputResolutionFlag` CLI util so the alias signal now reaches `SerializableDistributedRenderConfig`. Studio Server keeps its canonical-only HTTP contract; that intent is now pinned in tests. 2. Preflight recompute (hardening): the earlier "downgrade aspect-mismatch" preflight cleared un-remapped mismatches, so IG 4:5 (non-preset aspect, no sibling) and portrait-4K comp + `--resolution 1080p` (remap + downsample) both slipped through to fail late in `resolveDeviceScaleFactor`. Now `checkRenderResolutionPreflight` computes the effective preset via `suggestMatchingPreset` (mirroring the compile stage's `adaptAspectAgnosticResolution`) and re-checks against that — only genuinely-fixable mismatches clear early. New tests pin both regressed input classes. 3. Docker forwarding boundary test (Miga's important #2): pinned `1080p` survives verbatim as `--resolution 1080p` in the Docker args so the in-container CLI can re-run `isAspectAgnosticResolutionAlias`. 4. Doc-nit (Miga): parsers/src/types.ts no longer references the nonexistent `resolveResolutionForComposition` — points at the actual remap helpers. Fallow: cloudrun.ts / lambda.ts share 390 lines of pre-existing structural symmetry (parallel AWS + GCP dispatchers), and lambda/render.ts + render-batch.ts declare parallel RenderArgs interfaces. Both re-flagged after threading the aspect-agnostic field through each surface; ignored with justification in .fallowrc.jsonc. lambda.ts's `run` and lambda/render.ts's `waitForCompletion` are pre-existing CRAP-score hotspots untouched by this PR — added under health.ignore. Co-Authored-By: Claude <noreply@anthropic.com> — Via
This commit is contained in:
@@ -92,6 +92,7 @@ import {
|
||||
normalizeResolutionFlag,
|
||||
isAspectAgnosticResolutionAlias,
|
||||
checkOutputResolutionCompatibility,
|
||||
suggestMatchingPreset,
|
||||
parseFps,
|
||||
fpsToNumber,
|
||||
fpsToFfmpegArg,
|
||||
@@ -1216,20 +1217,37 @@ export async function checkRenderResolutionPreflight(
|
||||
// Couldn't determine the composition's actual dimensions — defer to the
|
||||
// pipeline's own defense-in-depth check rather than guess.
|
||||
if (!dims) return undefined;
|
||||
// Aspect-agnostic aliases (`--resolution 1080p` / `hd` / `4k` / `uhd`)
|
||||
// don't nail an orientation — the compile stage remaps them to the
|
||||
// composition's orientation via `adaptAspectAgnosticResolution` +
|
||||
// `suggestMatchingPreset`. Mirror that remap here BEFORE running the
|
||||
// compatibility check so the early rejection reflects the *effective*
|
||||
// preset the pipeline will actually use.
|
||||
//
|
||||
// Doing this pre-check (rather than post-hoc "downgrade aspect-mismatch")
|
||||
// is what makes the following cases fail early with an aspect-aware
|
||||
// message instead of throwing deep in the compile stage after Chrome +
|
||||
// ffmpeg have already spun up (Rames Δ2 on PR #2529):
|
||||
//
|
||||
// - Non-preset aspect (e.g. IG 4:5 1080×1350): no sibling preset
|
||||
// matches → `suggestMatchingPreset` returns `undefined` → we keep the
|
||||
// original preset and surface the aspect-mismatch normally.
|
||||
// - Orientation-flip + tier-too-small (portrait-4K comp 2160×3840 +
|
||||
// `--resolution 1080p`): remaps `landscape` → `portrait` (1080×1920),
|
||||
// re-check catches the downsample early with a clear message.
|
||||
const effective =
|
||||
modes.aspectAgnostic === true
|
||||
? (suggestMatchingPreset(dims.width, dims.height, outputResolution) ?? outputResolution)
|
||||
: outputResolution;
|
||||
const compat = checkOutputResolutionCompatibility({
|
||||
compositionWidth: dims.width,
|
||||
compositionHeight: dims.height,
|
||||
outputResolution,
|
||||
outputResolution: effective,
|
||||
alphaRequested: modes.alphaRequested,
|
||||
hdrRequested: modes.hdrRequested,
|
||||
});
|
||||
// Narrow to the incompatible case; `message`/`kind` are always set there.
|
||||
if (compat.ok || !compat.message || !compat.kind) return undefined;
|
||||
// Aspect-agnostic aliases delegate orientation to the composition — a
|
||||
// landscape-vs-portrait mismatch is expected and self-heals in the compile
|
||||
// stage. Only *aspect-mismatch* is downgraded; other issue kinds still
|
||||
// block (see the `aspectAgnostic` note above).
|
||||
if (modes.aspectAgnostic && compat.kind === "aspect-mismatch") return undefined;
|
||||
return { message: compat.message, kind: compat.kind };
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user