From 797e81ee06a7c07bf79b716ff4519ed29faa27dc Mon Sep 17 00:00:00 2001 From: Miguel Angel Simon Sierra Date: Sat, 24 Oct 2026 01:13:46 -0400 Subject: [PATCH] test(engine): deferred counts match extraction on a B-frame NTSC source; VFR is not deferred --- .../videoFrameExtractor.remoteTail.test.ts | 57 +++++++++++++++++++ 1 file changed, 57 insertions(+) diff --git a/packages/engine/src/services/videoFrameExtractor.remoteTail.test.ts b/packages/engine/src/services/videoFrameExtractor.remoteTail.test.ts index 602b4e2a37..0f87fe5b13 100644 --- a/packages/engine/src/services/videoFrameExtractor.remoteTail.test.ts +++ b/packages/engine/src/services/videoFrameExtractor.remoteTail.test.ts @@ -92,3 +92,60 @@ describe.skipIf(!HAS_FFMPEG)("deferred windows of a remote source", { timeout: 1 expect(peak).toBeGreaterThan(Math.max(1, Math.floor(cpus().length / 2))); }); }); + +describe.skipIf(!HAS_FFMPEG)("a deferred window inside local sources of other shapes", { timeout: 120_000 }, () => { + let dir: string; + beforeAll(() => { + dir = mkdtempSync(join(tmpdir(), "hf-defer-shapes-")); + const make = (name: string, args: string[]) => { + const made = spawnSync(getFfmpegBinary(), ["-v", "error", "-y", ...args, join(dir, name)]); + expect(made.status).toBe(0); + }; + const source = ["-f", "lavfi", "-i", "testsrc2=size=160x90:rate=30000/1001:duration=12"]; + make("ntsc-bframes.mp4", [...source, ...["-c:v", "libx264", "-bf", "3", "-g", "48"]]); + make("vfr.mp4", [ + ...source, + ...["-vf", "select=not(mod(n\\,3))+not(mod(n\\,7))", "-fps_mode", "vfr", "-c:v", "libx264"], + ]); + }); + afterAll(() => rmSync(dir, { recursive: true, force: true })); + + const window = (src: string, mediaStart: number): VideoElement => ({ + id: `w-${mediaStart}`, + src, + start: 0, + end: 3, + mediaStart, + loop: false, + hasAudio: false, + }); + + it.each([ + { fps: 24, mediaStart: 1.37 }, + { fps: 30, mediaStart: 0 }, + { fps: 60, mediaStart: 4.2 }, + ])("counts $fps fps frames of an NTSC source with B-frames as extracting them does", async (c) => { + const options = { fps: c.fps, outputDir: join(dir, `out-${c.fps}-${c.mediaStart}`) }; + const full = await extractAllVideoFrames([window("ntsc-bframes.mp4", c.mediaStart)], dir, options); + const deferred = await extractAllVideoFrames( + [window("ntsc-bframes.mp4", c.mediaStart)], + dir, + { ...options, outputDir: join(dir, `defer-${c.fps}-${c.mediaStart}`), deferRangeExtraction: true }, + ); + + expect(deferred.extracted[0]?.deferredRange).toBeDefined(); + expect(deferred.extracted[0]?.totalFrames).toBe(full.extracted[0]?.totalFrames); + }); + + it("leaves a variable-frame-rate source to a full extraction", async () => { + const deferred = await extractAllVideoFrames([window("vfr.mp4", 1)], dir, { + fps: 30, + outputDir: join(dir, "defer-vfr"), + deferRangeExtraction: true, + }); + + expect(deferred.errors).toEqual([]); + expect(deferred.extracted[0]?.deferredRange).toBeUndefined(); + expect(deferred.extracted[0]?.framePaths.size).toBeGreaterThan(0); + }); +});