Improve error handling in background blur worker.

This commit is contained in:
Juliusz Chroboczek
2025-08-10 16:47:16 +02:00
parent 49dd875ad7
commit e6e750d06d
+46 -38
View File
@@ -38,49 +38,57 @@ async function loadImageSegmenter(model) {
}); });
} }
onmessage = async e => { async function foregroundMask(bitmap, timestamp) {
let data = e.data; if(!(bitmap instanceof ImageBitmap))
if(imageSegmenter == null) { throw new Error('Bad type for worker data');
try {
imageSegmenter = await loadImageSegmenter(data.model);
if(imageSegmenter == null)
throw new Error("loadImageSegmenter returned null");
} catch(e) {
postMessage(e);
return;
}
postMessage(null);
return;
}
let bitmap = e.data.bitmap;
if(!(bitmap instanceof ImageBitmap)) {
postMessage(new Error('Bad type for worker data'));
return;
}
try { try {
let width = bitmap.width; let width = bitmap.width;
let height = bitmap.height; let height = bitmap.height;
imageSegmenter.segmentForVideo( let p = new Promise((resolve, reject) =>
bitmap, e.data.timestamp, imageSegmenter.segmentForVideo(
result => { bitmap, timestamp,
/** @type{Uint8Array} */ result => resolve(result),
let mask = result.categoryMask.getAsUint8Array(); ));
let id = new ImageData(width, height); let result = await p;
for(let i = 0; i < mask.length; i++) /** @type{Uint8Array} */
id.data[4 * i + 3] = mask[i]; let mask = result.categoryMask.getAsUint8Array();
result.close(); let id = new ImageData(width, height);
createImageBitmap(id).then(ib => { for(let i = 0; i < mask.length; i++)
postMessage({ id.data[4 * i + 3] = mask[i];
bitmap: bitmap, result.close();
mask: ib,
}, [bitmap, ib]); let ib = await createImageBitmap(id);
}); return {
}, bitmap: bitmap,
); mask: ib,
};
} catch(e) { } catch(e) {
bitmap.close(); bitmap.close();
throw(e);
}
}
onmessage = async e => {
try {
let data = e.data;
if(data.model) {
if(imageSegmenter) {
throw new Error("image segmenter already inititialised");
}
imageSegmenter = await loadImageSegmenter(data.model);
if(!imageSegmenter)
throw new Error("loadImageSegmenter returned null");
postMessage(null);
} else if(data.bitmap) {
if(imageSegmenter == null)
throw new Error("image segmenter not initialised");
let mask = await foregroundMask(data.bitmap, data.timestamp);
postMessage(mask, [mask.bitmap, mask.mask]);
} else {
throw new Error("unexpected message type");
}
} catch(e) {
postMessage(e); postMessage(e);
} }
}; }