Improve error handling in background blur worker.
This commit is contained in:
@@ -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);
|
||||||
}
|
}
|
||||||
};
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user