!7 cmodule VectorImageStream > DynImageSurfaceAndEnabled { transient S fpsText; transient new PerSecondCounter fpsCounter; start { enableDoubleBuffering(); // flickers when partially obscured otherwise dm_vmBus_onMessage_q vectorSDK_gotLine((mod, s) -> handleLine((S) s)); doEvery(1.0, r { setField(fpsText := fpsCounter.getLast() + " fps"); }); } void handleLine(S s) { S prefix = "img: "; if (!enabled || !startsWith(s, prefix)) ret; fpsCounter.inc(); setImage(imageFromBytes(base64decode(substring(s, prefix)))); } void startStream enter { dm_call vectorSDK('startCamStream); } afterVisualize { addComponent_inFront(buttons, jbutton("Start stream", rThread startStream)); addComponent_inFront(dm_label fpsText()); } }