// Update is called once per frame
    unsafe void Update()
    {
        string msg = udpKeyboard.GetLatestUDPPacket();

        if (!textureInitialized && captureStatus == CaptureStatus.Initialized)
        {
            mediaTexture = new Texture2D(videoWidth, videoHeight, TextureFormat.RGBA32, false);
            mediaMaterial.mainTexture = mediaTexture;
            textureInitialized        = true;
            ToggleVideo();
        }
        //Debug.Log(TAG + " Update() thread ID is " + Thread.CurrentThread.ManagedThreadId);

        if (_tempBitmap != null && textureInitialized)
        {
            Interlocked.Exchange(ref upBitmap, _tempBitmap);
            using (var input = upBitmap.LockBuffer(BitmapBufferAccessMode.Read))
                using (var inputReference = input.CreateReference()) {
                    byte *inputBytes;
                    uint  inputCapacity;
                    ((IMemoryBufferByteAccess)inputReference).GetBuffer(out inputBytes, out inputCapacity);
                    mediaTexture.LoadRawTextureData((IntPtr)inputBytes, videoWidth * videoHeight * 4);
                    mediaTexture.Apply();

                    if (msg == " ")
                    {
                        byte[] bytes = mediaTexture.EncodeToPNG();
                        Debug.Log(TAG + ": Trigger sending or saving");
                        frameSaver.SaveData(bytes);
                    }
                }
        }

        if (msg == "s")
        {
            ToggleVideo();
        }

        if (captureStatus == CaptureStatus.Clean)
        {
            calibrationText.text = "Calibration not started";
        }
        else if (captureStatus == CaptureStatus.Initialized)
        {
            calibrationText.text = "Calibration initializing";
        }
        else if (captureStatus == CaptureStatus.Running)
        {
            calibrationText.text = "Calibration: " + frameSaver.saveCount + " images saved";
        }
    }