Repository navigation
feat(producer,studio): wire capture motion blur into renders and Studio - #5969
Conversation
a4a310e to
68737fe
Compare
76f557d to
fcf0512
Compare
miguel-heygen
left a comment
There was a problem hiding this comment.
Delta review at full headfcf0512a4427331842036cdc7f73da6eb142ccd0, relative to68737fe2.
Audited: htmlInCanvas.ts form detection/marking, package subpath exports, defect predicates/version bounds, blur wrap/unwrap marking, VFX capture-form adoption and Studio capability consumer. Detection prefers layoutSubtree before drawable/updateElementGeometry, and nested-canvas checks include both forms. Defect version bounds match the author's measured claims; the next PR intentionally makes them conservative across versions.
Trusting: the supplied real-Chrome defect measurements and private test audit; no fresh browser comparison by Home.
The inherited #5875 pose and #5967 timeout findings remain; this delta approval does not clear the complete stack. Saved/fresh prior human reviews and inline comments were empty. Exact-head hosted checks pass/skip; the private focused core run passed124 authored tests. Inspected child regression logs execute3 visual/audio cases, not every new unit test. Browser-version screenshots, HDR output, worker parity, colour and performance measurements were not independently rerun. No provider call, merge or release.
— Magi (Home)
Verdict: APPROVE
Reasoning: No additional blocking defect found in this change relative to its stack parent; the foundation fixes remain required.
68737fe to
c47bef3
Compare
fcf0512 to
af9d2eb
Compare
c47bef3 to
27f076c
Compare
af9d2eb to
9ec57dd
Compare
27f076c to
3a35ca0
Compare
9ec57dd to
774f8ab
Compare
miguel-heygen
left a comment
There was a problem hiding this comment.
Reviewed exact head 774f8abccd4d0290d2c28257d259ad435a15145d relative to 3a35ca04264c42a87c610b9ecfa15620b3629569.
Audited preview availability/explicit false through Studio, server, CLI adapter, producer probe/capture and engine pre-navigation installation; compiler root/opt-in hint and video injection before paint settlement. False remains off end-to-end; absence/true preserves root opt-in. Read changed integration sites in larger producer/engine files, not every unrelated existing line. Author browser/colour/performance measurements were not rerun.
Independent revision-bound review of the nine-PR composition. Earlier approvals/requests covered older heads. Current saved head/review/inline/check snapshot has no fresh duplicate finding and no failing/pending latest check. Stacked broad-suite skips are not executed tests.
Audited: Studio capability/off choice through server, CLI adapter, producer probe/build/capture and engine pre-navigation installer; compiler opt-in/root choice and video injection before paint settle.
Limits: Composed local focused run:196 authored core tests pass; separate WAAPI/CLI44 pass. Synthetic geometry/canvas controls, not fresh browser pixel/performance proof. No app/model/provider call, source fix, merge or release.
— Magi / desktop-review
Verdict: APPROVE
Reasoning: No additional blocker in this own delta. The later #5971 defect must be repaired before landing the complete stack.
3a35ca0 to
d2489eb
Compare
774f8ab to
7780f04
Compare
The base branch was changed.
11ed12a to
3436c8f
Compare
Edit accuracy: accurate 271 (base branch 271), smooth 140 of thoseThe gate passes. Quarantined, measured but not gated (0) Unstable (1)
|
3436c8f to
d082f58
Compare
Carry the runtime's blur through the render pipeline and the Studio render panel. - engine: installPageMotionBlur sets the page-side off switch and the render's device scale before any author script runs; CaptureOptions.pageMotionBlur lets a caller stand the page blur down. - producer: a composition that asks for data-motion-blur on the root the runtime would pick forces screenshot capture, because html-in-canvas needs a real paint; the probe session carries the request's pageMotionBlur like every other session. - studio-server and Studio: the render panel sends previewMotionBlur, the render route turns "off" into pageMotionBlur once, and the Studio dev server and the CLI server both receive the final value. - mover scan: a large element that is see-through while it moves (a sweep, a light leak) is no mover, including a large image or canvas with alpha; the scan skips elements moved by a 3D individual transform property. - cli snapshot injects video frames before the seek settles, matching the engine's order. Folded review fixes: R1, R2, R3 (scan half), R7, R16, R18, T3 (render adapters). Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
d082f58 to
dd4f93c
Compare
… defect checks (heygen-com#6055) heygen-com#5971 and heygen-com#5990-heygen-com#5992 added htmlInCanvasDefects.ts and its package export after heygen-com#5969 last raised this budget, taking core to 3935667 bytes unpacked. main's Build has failed on that since 4371981. Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
What
Carries capture motion blur through renders and Studio, and tightens which elements the scan blurs.
installPageMotionBlursetsPAGE_MOTION_BLUR_OFF_GLOBALbefore any page script runs, when the engine's own sub-frame blur is on (--motion-blur) or when the render must match a Studio preview that could not blur, and tells the page the render's device scale.CaptureOptions.pageMotionBlurcarries the request.data-root="true"first) setsdata-motion-blur="on"gets acaptureMotionBlurrender-mode hint and goes through screenshot capture, because html-in-canvas needs a real paint; it is not pinned to one worker. A script-set attribute is not seen: it has to be in the HTML. The probe session carries the request'spageMotionBlurlike every other session, so "off" survives a render with nodata-duration.previewMotionBlur, true only if Studio's own browser hasdrawElementImageandrequestPaint. The render route turnspreviewMotionBlur: falseintopageMotionBlur: "off"once, so the Studio dev server and the CLI server both receive the final value.<video>counts as opaque. The scan also skips elements moved by a 3Drotateaxis or a ztranslate.snapshot: injects video frames before the seek settles, matching the engine's order.Why
Part 4 of 9 in the capture motion blur stack: #5875 → #5967 → #5968 → #5969 → #5970 → #5971 → #5990 → #5991 → #5992. It builds on #5968; this is where a render can use the runtime.
Stack goal: opt-in capture motion blur for compositions, in Studio preview and in renders, drawn with Chrome's html-in-canvas. Nothing blurs without
data-motion-blur="on"on the root.Notes
previewMotionBlur: falsethe render has no blur, even for opted-in compositions.--motion-blur) and page blur never both run.--motion-blur27 min. Compositions that are blocked or static cost nothing extra.<video>in Studio preview: a video drawn through the capture is about 2–3% darker than normal playback, visible as a small brightness change on play/pause. Renders are unaffected (video frames are injected as images). Accepted.background-image,mask-imageorclip-paththat lets the scene show through; an element that is see-through over less than half of the scene is not recognised as a sweep. A large image or canvas whose pixels cannot be read (cross-origin) counts as see-through and is not blurred. All documented, not fixed.overflow:hidden; a 2D flip throughscaleX = 0blends as rotation; sub-pixelleftsteps land in whole pixels; a fast child inside a parent that moved earlier is not blurred; SVG elements are not scanned.Before
k3-promo at 9.1 s, no motion blur:
After
Same frame with capture motion blur (360° shutter): the pins, the text and the box smear along their paths.
Testing
pageMotionBlur.test.ts: the off switch for engine blur and for an unsupported preview, device scale.htmlCompiler.test.ts: the render-mode hint on the runtime's root, not applied when the preview could not blur;probeStage.test.ts: the probe session carriespageMotionBlur;renderOrchestrator.test.tsand request validation:pageMotionBluris passed through and only"off"is accepted.render.test.tsand CLIstudioServer.renderBrowser.test.ts/ Studiovite.adapter.render.test.ts: the adapters receivepageMotionBlur: "off"forpreviewMotionBlur: false; StudiouseRenderQueueMotionBlur.test.tsx: the request body carries it.discover.test.ts: translucent, fading, colour and paint-less sweeps are no mover, opaque ones stay, large images and canvases with and without alpha, 3D individual transforms; CLIsnapshot.test.tsandcaptureCompositionFrame.test.ts: the order of video injection and seek.bun run buildandtsc --noEmitin core, engine, producer, cli, studio-server and studio pass; comment ratchet against feat(core): harden the capture motion blur runtime lifecycle #5968's branch passes; no package size budget changes.🤖 Generated with Claude Code