feat(review): flag handles in the review player (metadata only)
Deploy / deploy (push) Successful in 3m31s
Deploy / deploy (push) Successful in 3m31s
Renders run 8 frames past the cut at each end. Directors were flagging glitches in unfixed handles as shot problems, so the player now marks them — without trimming or burning anything into the EXRs/MOV/MP4. - Version.handleHead/handleTail/pictureStartFrame, Export.handleHead/ handleTail; migration backfills pipeline exports and their preview versions from the manifest's handleFrames (else 8) - AE panel: "Includes handles [8] frames each end" -> manifest.review; older manifests fall back to source.handleFrames - finalize copies handles onto the Version; worker 1.6.4 reports the head slate length (pictureStartSeconds), else the player infers it as MP4 frames - EXR frameCount - Player: hatched HANDLE / SLATE regions and cut marks on the timeline, "HEAD/TAIL HANDLE · NOT IN EDIT" overlay on handle frames, HANDLE badge on notes, "Edit range only" toggle (default on in the client portal) - Staff Handles editor on the review page for manual uploads/corrections Also fixes two player bugs found while testing: timeToFrame floored float error (every seek landed a frame early), and J/reverse never ran (the keyboard effect's cleanup stopped it on the next render). Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,22 @@
|
||||
import { describe, expect, it } from "vitest";
|
||||
import { frameToTime, timeToFrame } from "./frame-utils";
|
||||
|
||||
describe("timeToFrame", () => {
|
||||
it("round-trips every frame through frameToTime", () => {
|
||||
for (const fps of [23.976, 24, 25, 29.97, 30]) {
|
||||
for (let f = 0; f < 5000; f++) {
|
||||
expect(timeToFrame(frameToTime(f, fps), fps)).toBe(f);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
it("reads a seek target rounded to microseconds as that frame", () => {
|
||||
// Browsers can report currentTime rounded, e.g. 4/24 as 0.166666
|
||||
expect(timeToFrame(0.166666, 24)).toBe(4);
|
||||
});
|
||||
|
||||
it("still floors positions inside a frame", () => {
|
||||
expect(timeToFrame(4.5 / 24, 24)).toBe(4);
|
||||
expect(timeToFrame(4.99 / 24, 24)).toBe(4);
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user