This object extends LuminanceSource around an array of YUV data returned from the camera driver, with the option to crop to a rectangle within the full data. This can be used to exclude superfluous pixels around the perimeter and speed up decoding. It works for any pixel format where the Y channel is planar and appears first, including YCbCr_420_SP and YCbCr_422_SP. @author [email protected] (Daniel Switkin)
Inheritance: ZXing.BaseLuminanceSource
		public void OnPreviewFrame (byte [] bytes, Android.Hardware.Camera camera)
		{
			if ((DateTime.Now - lastPreviewAnalysis).TotalMilliseconds < 250)
				return;

			try 
			{
				byte[] rotatedData = new byte[bytes.Length];
				for (int y = 0; y < height; y++) {
				    for (int x = 0; x < width; x++)
				        rotatedData[x * height + height - y - 1] = bytes[x + y * width];
				}

				var dataRect = GetFramingRectInPreview();

				var luminance = new PlanarYUVLuminanceSource (rotatedData, width, height, dataRect.Left, dataRect.Top, dataRect.Width(), dataRect.Height(), false);
				var binarized = new BinaryBitmap (new ZXing.Common.HybridBinarizer(luminance));
				var result = reader.decodeWithState(binarized);

				lastPreviewAnalysis = DateTime.Now;

				if (result == null || string.IsNullOrEmpty (result.Text))
					return;

				Android.Util.Log.Debug("ZXing.Mobile", "Barcode Found: " + result.Text);

				ShutdownCamera();

				activity.OnScan (result);

			} catch (ReaderException) {
				Android.Util.Log.Debug("ZXing.Mobile", "No barcode Found");
				// ignore this exception; it happens every time there is a failed scan

			} catch (Exception){

				// TODO: this one is unexpected.. log or otherwise handle it

				throw;
			}
		}
		public void OnPreviewFrame (byte [] bytes, Android.Hardware.Camera camera)
		{
			if ((DateTime.Now - lastPreviewAnalysis).TotalMilliseconds < 150)
				return;
			
			try 
			{
				//Fix for image not rotating on devices
				byte[] rotatedData = new byte[bytes.Length];
				for (int y = 0; y < height; y++) {
				    for (int x = 0; x < width; x++)
				        rotatedData[x * height + height - y - 1] = bytes[x + y * width];
				}
				
				var cameraParameters = camera.GetParameters();

				//Changed to using a YUV Image to get the byte data instead of manually working with it!
				var img = new YuvImage(rotatedData, ImageFormatType.Nv21, cameraParameters.PreviewSize.Width, cameraParameters.PreviewSize.Height, null);	
				var dataRect = GetFramingRectInPreview();
			
				var luminance = new PlanarYUVLuminanceSource (img.GetYuvData(), width, height, dataRect.Left, dataRect.Top, dataRect.Width(), dataRect.Height(), false);
				//var luminance = new PlanarYUVLuminanceSource(img.GetYuvData(), cameraParameters.PreviewSize.Width, cameraParameters.PreviewSize.Height, 0, 0, cameraParameters.PreviewSize.Width, cameraParameters.PreviewSize.Height, false);
				var binarized = new BinaryBitmap (new ZXing.Common.HybridBinarizer(luminance));
				var result = reader.decodeWithState(binarized);

				lastPreviewAnalysis = DateTime.Now;

				if (result == null || string.IsNullOrEmpty (result.Text))
					return;

				Android.Util.Log.Debug("ZXing.Mobile", "Barcode Found: " + result.Text);

				ShutdownCamera();

				activity.OnScan (result);

			} catch (ReaderException) {
				Android.Util.Log.Debug("ZXing.Mobile", "No barcode Found");
				// ignore this exception; it happens every time there is a failed scan

			} catch (Exception){

				// TODO: this one is unexpected.. log or otherwise handle it

				throw;
			}
		}