Tighten needsFit to exact canvas size, guard against empty renders
needsFit only compared aspect ratio, so a same-aspect-but-larger still (e.g. a 4032x2268 phone photo against a 1344x768 canvas) would skip fitting and hand MiniMaxH3AddGuide a still that does not match the job's own latent size. Require an exact width+height match instead; anything else (including unreadable dimensions) still fits. Also guard the video save path: an empty Comfy download, an empty stitched assembly, or a stitched result with no readable duration now fails the job with a clear error instead of silently saving/attaching a broken zero-length clip. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -34,6 +34,10 @@ function fakePng(width, height) {
|
||||
return buf
|
||||
}
|
||||
const PNG_32x32 = fakePng(32, 32)
|
||||
// A 16:9 phone photo -- same aspect as the 1344x768 job canvas but a much larger pixel size.
|
||||
// This is the exact shape of the regression: same-aspect-different-size must still be fit.
|
||||
const PNG_PHONE_16x9 = fakePng(4032, 2268)
|
||||
const CANVAS_16x9 = { width: 1344, height: 768 }
|
||||
|
||||
const text = readFileSync(new URL('../server/utils/studio2/runner.ts', import.meta.url), 'utf8')
|
||||
const tree = ts.createSourceFile('runner.ts', text, ts.ScriptTarget.Latest, true)
|
||||
@@ -90,9 +94,32 @@ test('upload() still fits a source still whose aspect truly differs from the job
|
||||
assert.equal(fitCalled, true)
|
||||
})
|
||||
|
||||
test('needsFit is false for an exact canvas match and true for a real aspect mismatch', () => {
|
||||
test('needsFit is false only for an exact width+height match; same-aspect-different-size still needs fitting', () => {
|
||||
assert.equal(needsFit(PNG_32x32, 32, 32), false)
|
||||
assert.equal(needsFit(PNG_32x32, 1344, 768), true)
|
||||
// Same 16:9 aspect as the canvas, but 3x the pixel size -- must still fit.
|
||||
assert.equal(needsFit(PNG_PHONE_16x9, CANVAS_16x9.width, CANVAS_16x9.height), true)
|
||||
assert.equal(needsFit(PNG_PHONE_16x9, 4032, 2268), false)
|
||||
assert.equal(needsFit(Buffer.alloc(64), CANVAS_16x9.width, CANVAS_16x9.height), true) // unreadable dims always fit
|
||||
})
|
||||
|
||||
test('New Video (mode video, no startClipId): a same-aspect phone still uploaded as "source" is fitted to the job canvas', async () => {
|
||||
const f = fixture()
|
||||
f.record.request.settings = { ...CANVAS_16x9 }
|
||||
let fitCalled = false
|
||||
f.scope.fitStill = async (data, w, h) => { fitCalled = true; assert.equal(w, CANVAS_16x9.width); assert.equal(h, CANVAS_16x9.height); return Buffer.alloc(64) }
|
||||
const upload = extractUpload(f.scope)
|
||||
await upload(f.record, 'source', PNG_PHONE_16x9)
|
||||
assert.equal(fitCalled, true, 'a 4032x2268 still against a 1344x768 canvas must still be fitted despite matching aspect')
|
||||
})
|
||||
|
||||
test('Extend (startClipId set): an anchor already sized to the job canvas uploaded as "start" is not fitted', async () => {
|
||||
const f = fixture()
|
||||
f.record.request.settings = { ...CANVAS_16x9 }
|
||||
const anchorAtCanvasSize = fakePng(CANVAS_16x9.width, CANVAS_16x9.height)
|
||||
const upload = extractUpload(f.scope) // f.scope.fitStill throws if called -- see fixture()
|
||||
await upload(f.record, 'start', anchorAtCanvasSize)
|
||||
assert.equal(f.record.handoffFitted, false)
|
||||
})
|
||||
|
||||
test('two extends at identical width/height: the anchor PNG reaches Comfy byte-identical, no ffmpeg fit', async () => {
|
||||
|
||||
Reference in New Issue
Block a user