private IEnumerator CameraLoop()
        {
            camera_coroutine_running = true;
            while (camera_coroutine_running)
            {
                camera_loop_running = true;
                if (_webcam != null && _webcam.IsUpdated())
                {
                    //Debug.Log("webcam Pikkart Camera Loop camera updated");
                    PikkartARCore.SetCameraOriginalSize(Constants.CAMERA_REQUESTED_WIDTH, Constants.CAMERA_REQUESTED_HEIGHT);

                    PikkartARCore.CopyNewFrame(_webcam.GetDataAsIntPtr(), _webcam.GetCameraWidth(), _webcam.GetCameraHeight());
                    //PikkartARCore.CopyNewFrame32(_webcam.GetDataAsColor32(), Constants.CAMERA_REQUESTED_WIDTH, Constants.CAMERA_REQUESTED_HEIGHT);
                    //_webcam.UploadCameraDataAsColor32();

                    bool found_something = PikkartARCore.ImageProcessing();

                    if (Screen.currentResolution.width > Screen.currentResolution.height)
                    {
                        if (cam != null)
                        {
                            cam.projectionMatrix = MatrixUtils.GetAlternateLandscapeProjectionMatrix();
                        }
                    }
                    else
                    {
                        if (cam != null)
                        {
                            cam.projectionMatrix = MatrixUtils.GetAlternatePortraitProjectionMatrix();
                        }
                    }

                    String markerFound  = "";
                    int    logo_payload = -1;

                    int numTrackedMarkers = 0;
                    if (found_something)
                    {
                        numTrackedMarkers = PikkartARCore.GetTrackedInternalIDs(trackedMarkersData.GetArray());
                    }
                    //Debug.Log("markerFound=numTrackedMarkers " + numTrackedMarkers);
                    if (numTrackedMarkers > 0)
                    {
                        int size = PikkartARCore.GetMarkerNameFromInternalIDs(trackedMarkersData.GetArray()[0], markerFoundPtr);
                        markerFound = Marshal.PtrToStringAnsi(markerFoundPtr, size - 1);
                        if (IsSeethroughDevice)
                        {
                            size = PikkartARCore.GetMarkerPoseInternalID_WithPrediction(trackedMarkersData.GetArray()[0], PredictionFrames, viewMatrixData.GetArray());
                        }
                        else
                        {
                            size = PikkartARCore.GetMarkerPoseInternalID(trackedMarkersData.GetArray()[0], viewMatrixData.GetArray());
                        }
                        logo_payload = PikkartARCore.MarkerHasLogoInternalId(trackedMarkersData.GetArray()[0]);
                        if (logo_payload > 0)
                        {
                            recognitionManager.ARLogoFound(trackedMarkersData.GetArray()[0], logo_payload);
                        }
                        else
                        {
                            logo_payload = -1;
                        }
                    }
                    else
                    {
                        markerFound = "";
                    }

                    if (markerFound == "")
                    {
                        if (recognitionManager != null)
                        {
                            if (recognitionManager.IsRecognitionRunning())
                            {
                                recognitionManager.LocalMarkerNotFound();
                            }
                        }
                        viewMatrix = Matrix4x4.identity;
                    }
                    else if (markerFound != "")
                    {
                        if (IsSeethroughDevice)
                        {
                            if (previousMarkerFound != "" && markerFound != previousMarkerFound)
                            {
                                recognitionManager.MarkerTrackingLost(previousMarkerFound);
                            }
                        }
                        if (recognitionManager != null && previousMarkerFound == "")
                        {
                            recognitionManager.LocalMarkerFound(markerFound, trackedMarkersData.GetArray()[0]);
                        }
                        viewMatrix = MatrixUtils.GetViewMatrixFromArray(viewMatrixData.GetArray());

                        viewMatrix = MatrixUtils.GetRotationMatrixForOrientation() * viewMatrix;
                    }

                    if (!IsSeethroughDevice)
                    {
                        if (previousMarkerFound != "" && markerFound == "")
                        {
                            recognitionManager.MarkerTrackingLost(previousMarkerFound);
                        }
                    }
                    previousMarkerFound = markerFound;

                    MarkerUpdate();

#if UNITY_EDITOR
                    _webcam.UpdateVisibleFrame();
#else
                    if (!IsSeethroughDevice)
                    {
                        GL.IssuePluginEvent(PikkartARCore.GetRenderEventFunc(), 666);
                    }
#endif

                    //Debug.Log("markerFound=" + markerFound);
                }
                //yield return new WaitUntil(() => _webcam!=null && _webcam.IsUpdated() == true);
                //yield return null;
                yield return(new WaitForEndOfFrame());
            }
            camera_loop_running = false;
        }