public ProcessorState(
            Ref<System.Drawing.Rectangle> crop, Ref<System.Drawing.Rectangle> crop_values, 
            Ref<int> upper, Ref<int> lower,
            KinectData data_, short[] depth, byte[] depth_label_, byte[] rgb, byte[] bitmap_bits,
            Dictionary<Tuple<byte, byte, byte>, byte> nearest_cache_, Dictionary<byte, byte[]> label_color_,
            byte kBackgroundLabel, List<byte[]> centroid_colors_, List<byte> centroid_labels,
            Ref<bool> predict_on_enable_, Ref<bool>feature_extract_on_enable_,
            Ref<bool> overlay_start_, int kNoOverlay, int[] overlay_bitmap_bits_, int[] kEmptyOverlay,
            FeatureExtractionLib.FeatureExtraction feature, float[] predict_output_, int[] predict_labels_,
            List<IWebSocketConnection> all_sockets_,
            Filter.Step[] pipeline,
            HandGestureFormat hand_gesture_value_, RangeModeFormat range_mode_value_, int[] pool, byte[] bitmap_bits_copy, int radius, double density, int cluster_threshold_count)
        {
            this.crop = crop;
            this.crop_values = crop_values;
            this.upper = upper;
            this.lower = lower;
            this.data_ = data_;
            this.depth = depth;
            this.rgb = rgb;
            this.bitmap_bits_ = bitmap_bits;
            this.depth_label_ = depth_label_;
            this.bitmap_bits_copy_ = bitmap_bits_copy;
            
            this.nearest_cache_ = nearest_cache_;
            this.label_color_ = label_color_;
            this.kBackgroundLabel = kBackgroundLabel;
            this.centroid_colors_ = centroid_colors_;
            this.centroid_labels_ = centroid_labels;

            this.predict_on_enable_ = predict_on_enable_;
            this.feature_extract_on_enable_ = feature_extract_on_enable_;

            this.overlay_start_ = overlay_start_;
            this.kNoOverlay = kNoOverlay;
            this.overlay_bitmap_bits_ = overlay_bitmap_bits_;
            this.kEmptyOverlay = kEmptyOverlay;

            this.feature = feature;
            this.predict_output_ = predict_output_;
            this.predict_labels_ = predict_labels_;

            this.all_sockets_ = all_sockets_;
            this.pipeline = pipeline;

            this.hand_gesture_value_ = hand_gesture_value_;
            this.range_mode_value_ = range_mode_value_;

            this.pool_ = pool;
            this.radius_ = radius;
            this.density_ = density;
            this.cluster_threshold_count_ = cluster_threshold_count;

        }
        public DataFeed(DataSource source, RangeModeFormat setRangeModeValue)
        {
            this.source = source;
            RangeModeValue = setRangeModeValue;
            colorPixels = new byte[width * height * stride];
            depthPixels = new short[width * height];
            data = new KinectData();

            // Create the Kinect sensor anyway. Need for mapping depth to image.
            KinectSensor.KinectSensors.StatusChanged += (object sender, StatusChangedEventArgs e) =>
            {
                if (e.Sensor == sensor_ && e.Status != KinectStatus.Connected) SetSensor(null);
                else if ((sensor_ == null) && (e.Status == KinectStatus.Connected)) SetSensor(e.Sensor);
            };

            foreach (var sensor in KinectSensor.KinectSensors)
                if (sensor.Status == KinectStatus.Connected) SetSensor(sensor);
        }
        public Processor(Manager manager)
        {

            Debug.WriteLine("Start processor contruction");
            this.manager = manager;
            width = 640; height = 480;
            kColorStride = 4; kDepthStride = 1;
            image_ = new System.Windows.Controls.Image();
            image_.Width = width;
            image_.Height = height;
            depth_label_ = new byte[width * height];

            crop_values_ = new System.Drawing.Rectangle(
                Properties.Settings.Default.CropOffset.X,
                Properties.Settings.Default.CropOffset.Y,
                Properties.Settings.Default.CropSize.Width,
                Properties.Settings.Default.CropSize.Height);

            crop_ = new System.Drawing.Rectangle(0, 0, width - 1, height - 1);
            crop_ref_ = new Ref<System.Drawing.Rectangle>(() => crop_, val => { crop_ = val; });
            crop_val_ref_ = new Ref<System.Drawing.Rectangle>(() => crop_values_, val => { crop_values_ = val; });

            upper_ref_ = new Ref<int>(() => upper, val => { upper = val; });
            lower_ref_ = new Ref<int>(() => lower, val => { lower = val; });

            predict_on_enable_ref_ = new Ref<bool>(() => predict_on_enable_, val => { predict_on_enable_ = val; });
            feature_extract_on_enable_ref_ = new Ref<bool>(() => feature_extract_on_enable_, val => {feature_extract_on_enable_ = val; });

            overlay_start_ref_ = new Ref<bool>(() => overlayStart, val => { overlayStart = val; });

            overlayStart = false;
            kEmptyOverlay = new int[width * height * 4];
            for (int i = 0; i < kEmptyOverlay.Length; i++) kEmptyOverlay[i] = kNoOverlay;

            MinHueTarget = 360.0F;
            MaxHueTarget = 0.0F;
            MinSatTarget = 1F;
            MaxSatTarget = 0F;            
			            
            bitmap_ = new WriteableBitmap(640, 480, 96, 96, PixelFormats.Bgr32, null);
            bitmap_bits_ = new byte[640 * 480 * 4];
            tmp_buffer_ = new byte[640 * 480 * 4];
            overlay_bitmap_bits_ = new int[640 * 480 * 4]; // overlay
            image_.Source = bitmap_;

            image_.MouseLeftButtonUp += ImageClick;
            image_.MouseRightButtonDown += StartDrag;
            image_.MouseMove += Drag;
            image_.MouseRightButtonUp += EndDrag;

            SetCentroidColorAndLabel();

            if (manager.ProcessorMode == Manager.ProcessorModeFormat.Michael)
                RangeModeValue = RangeModeFormat.Near;
            else if (manager.ProcessorMode == Manager.ProcessorModeFormat.Arun)
                RangeModeValue = RangeModeFormat.Default;
            
            FleckLog.Level = LogLevel.Debug;
            if (server == null)
            {
                server = new WebSocketServer("ws://localhost:8181");
                server.Start(socket =>
                {
                    socket.OnOpen = () =>
                    {
                        Console.WriteLine("Socket opened.");
                        all_sockets_.Add(socket);
                    };

                    socket.OnClose = () =>
                    {
                        Console.WriteLine("Socket closed.");
                        all_sockets_.Remove(socket);
                    };

                    socket.OnMessage = message =>
                    {
                        Console.WriteLine("Message received: {0}", message);
                        socket.Send(String.Format("Message received from you: {0}", message));
                    };
                });
            }

            listOfTransformedPairPosition = new List<int[]>(); // remember to clear.

            Debug.WriteLine("Pass processor setting");
        }