mirror of
https://github.com/jech/galene.git
synced 2024-12-22 15:25:48 +01:00
0a14b78d67
We used to initialise MediaPipe at worker start, which prevented us from handling errors. We now do it at filter init, and stop the stream with an error message if initialisation fails.
66 lines
1.9 KiB
JavaScript
66 lines
1.9 KiB
JavaScript
'use strict';
|
|
|
|
let imageSegmenter;
|
|
|
|
async function loadImageSegmenter(model) {
|
|
let module = await import('/third-party/tasks-vision/vision_bundle.mjs');
|
|
let vision = await module.FilesetResolver.forVisionTasks(
|
|
"/third-party/tasks-vision/wasm"
|
|
);
|
|
|
|
return await module.ImageSegmenter.createFromOptions(vision, {
|
|
baseOptions: {
|
|
modelAssetPath: model,
|
|
},
|
|
outputCategoryMask: true,
|
|
outputConfidenceMasks: false,
|
|
runningMode: 'VIDEO',
|
|
});
|
|
}
|
|
|
|
onmessage = async e => {
|
|
let data = e.data;
|
|
if(imageSegmenter == null) {
|
|
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 {
|
|
let width = bitmap.width;
|
|
let height = bitmap.height;
|
|
imageSegmenter.segmentForVideo(
|
|
bitmap, e.data.timestamp,
|
|
result => {
|
|
/** @type{Uint8Array} */
|
|
let mask = result.categoryMask.getAsUint8Array();
|
|
let id = new ImageData(width, height);
|
|
for(let i = 0; i < mask.length; i++)
|
|
id.data[4 * i + 3] = mask[i];
|
|
result.close();
|
|
createImageBitmap(id).then(ib => {
|
|
postMessage({
|
|
bitmap: bitmap,
|
|
mask: ib,
|
|
}, [bitmap, ib]);
|
|
});
|
|
},
|
|
);
|
|
} catch(e) {
|
|
bitmap.close();
|
|
postMessage(e);
|
|
}
|
|
};
|