Esempio n. 1
0
 public CameraFeedRenderer(Context context) : base(context)
 {
     cameraManager             = (CameraManager)Context.GetSystemService(Context.CameraService);
     windowManager             = Context.GetSystemService(Context.WindowService).JavaCast <IWindowManager>();
     StateCallback             = new CameraStateCallback(this);
     SessionCallback           = new CameraCaptureSessionCallback(this);
     CaptureListener           = new CameraCaptureListener(this);
     CameraImageReaderListener = new CameraImageListener(this);
     OrientationEventListener  = new CameraPageOrientationEventListener(this, Context, global::Android.Hardware.SensorDelay.Normal);
 }
Esempio n. 2
0
 public CameraCaptureStateCallback
 (
     CaptureRequest.Builder captureBuilder,
     CameraCaptureSessionCallback captureListener,
     Handler backgroundHandler
 )
 {
     _captureBuilder    = captureBuilder;
     _captureListener   = captureListener;
     _backgroundHandler = backgroundHandler;
 }
Esempio n. 3
0
 public VideoSource()
 {
     OrientationToDegrees.Add(SurfaceOrientation.Rotation0, 90);
     OrientationToDegrees.Add(SurfaceOrientation.Rotation90, 0);
     OrientationToDegrees.Add(SurfaceOrientation.Rotation180, 270);
     OrientationToDegrees.Add(SurfaceOrientation.Rotation270, 180);
     Main          = SynchronizationContext.Current;
     context       = MainActivity.Instance;
     manager       = (CameraManager)context.GetSystemService(Context.CameraService);
     listener      = new CameraStateListener(this);
     callback      = new CameraCaptureSessionCallback(this);
     StateCallback = new CameraCaptureSessionStateCallback(this);
 }
Esempio n. 4
0
        // Creates a new {@link CameraCaptureSession} for camera preview.
        public void CreateCameraPreviewSession(bool builderexists = false)
        {
            try
            {
                var texture = mTextureView.SurfaceTexture;
                if (texture == null)
                {
                    throw new IllegalStateException("texture is null");
                }

                // We configure the size of default buffer to be the size of camera preview we want.
                texture.SetDefaultBufferSize(mPreviewSize.Width, mPreviewSize.Height);

                // This is the output Surface we need to start preview.
                var surface = new Surface(texture);

                // We set up a CaptureRequest.Builder with the output Surface.
                if (!builderexists)
                {
                    mPreviewRequestBuilder = mCameraDevice.CreateCaptureRequest(CameraTemplate.Preview);
                }

                //mPreviewRequestBuilder.Set(CaptureRequest.ControlAeTargetFpsRange, new Android.Util.Range(30, 120));

                mPreviewRequestBuilder.Set(CaptureRequest.ControlAeMode, (int)ControlAEMode.On);
                mPreviewRequestBuilder.Set(CaptureRequest.ControlAwbMode, (int)ControlAwbMode.Auto);
                mPreviewRequestBuilder.Set(CaptureRequest.ControlAePrecaptureTrigger, (int)ControlAEPrecaptureTrigger.Start);
                mPreviewRequestBuilder.Set(CaptureRequest.LensOpticalStabilizationMode, (int)LensOpticalStabilizationMode.On);
                mPreviewRequestBuilder.Set(CaptureRequest.EdgeMode, (int)EdgeMode.Fast);
                mPreviewRequestBuilder.Set(CaptureRequest.ShadingMode, (int)ShadingMode.HighQuality);
                mPreviewRequestBuilder.Set(CaptureRequest.TonemapMode, (int)TonemapMode.HighQuality);

                mPreviewRequestBuilder.AddTarget(surface);


                // Here, we create a CameraCaptureSession for camera preview.
                var surfaces = new List <Surface>();
                surfaces.Add(surface);
                surfaces.Add(mImageReader.Surface);

                mCameraCaptureSessionCallback = new CameraCaptureSessionCallback(this);

                mCameraDevice.CreateCaptureSession(surfaces, mCameraCaptureSessionCallback, null);
            }
            catch (CameraAccessException e)
            {
                Crashes.TrackError(e);
                e.PrintStackTrace();
            }
        }
Esempio n. 5
0
        protected void CapturePicture
        (
            string picturePath
        )
        {
            if (_cameraDevice == null)
            {
                return;
            }

            if (DeviceOrientation == null)
            {
                throw new NullReferenceException(nameof(DeviceOrientation));
            }

            if (DeviceOrientation == OrientationEventListener.OrientationUnknown)
            {
                return;
            }

            var cameraManager = GetCameraManager();

            CameraCharacteristics cameraCharacteristics
                = cameraManager.GetCameraCharacteristics(_cameraDevice.Id);

            Size[] jpegSizes      = null;
            Size[] thumbnailSizes = null;

            int cameraOrientation = 0;

            if (cameraCharacteristics != null)
            {
                var configurationMap = (StreamConfigurationMap)cameraCharacteristics.Get
                                       (
                    CameraCharacteristics.ScalerStreamConfigurationMap
                                       );

                jpegSizes = configurationMap.GetHighResolutionOutputSizes
                            (
                    (int)ImageFormatType.Jpeg
                            );

                if ((jpegSizes == null) || (jpegSizes.Length == 0))
                {
                    jpegSizes = configurationMap.GetOutputSizes
                                (
                        (int)ImageFormatType.Jpeg
                                );
                }

                thumbnailSizes = cameraCharacteristics.Get
                                 (
                    CameraCharacteristics.JpegAvailableThumbnailSizes
                                 )
                                 .ToArray <Size>();

                cameraOrientation = (int)cameraCharacteristics.Get
                                    (
                    CameraCharacteristics.SensorOrientation
                                    );
            }

            int jpegWidth  = 640; // why exactly these default values?!
            int jpegHeight = 480;

            if ((jpegSizes != null) && (jpegSizes.Length > 0))
            {
                jpegWidth  = jpegSizes[0].Width;
                jpegHeight = jpegSizes[0].Height;
            }

            ImageReader imageReader = ImageReader.NewInstance(jpegWidth,
                                                              jpegHeight,
                                                              ImageFormatType.Jpeg,
                                                              maxImages: 1);
            var outputSurfaces = new List <Surface>(2);

            outputSurfaces.Add(imageReader.Surface);
            outputSurfaces.Add(new Surface(TextureView.SurfaceTexture));

            CaptureRequest.Builder captureBuilder
                = _cameraDevice.CreateCaptureRequest(CameraTemplate.StillCapture);

            captureBuilder.AddTarget(imageReader.Surface);
            // https://developer.android.com/reference/android/hardware/camera2/CameraMetadata.html#CONTROL_MODE_AUTO
            captureBuilder.Set(CaptureRequest.ControlMode,
                               1); // CONTROL_MODE_AUTO

            int pictureRotation = (DeviceOrientation.Value + cameraOrientation) % 360;

            captureBuilder.Set(CaptureRequest.JpegOrientation,
                               pictureRotation);

            var jpegQuality = new Byte(JpegQuality);

            captureBuilder.Set(CaptureRequest.JpegQuality,
                               jpegQuality);

            captureBuilder.Set(CaptureRequest.JpegThumbnailQuality,
                               jpegQuality);

            var thumbnailSize = GetBestThumbnailSize(jpegWidth,
                                                     jpegHeight,
                                                     thumbnailSizes);

            captureBuilder.Set(CaptureRequest.JpegThumbnailSize,
                               thumbnailSize);

            var pictureFile = new File(picturePath);

            imageReader.SetOnImageAvailableListener(new ImageAvailableListener(pictureFile),
                                                    _backgroundHandler);

            var captureListener = new CameraCaptureSessionCallback(CreateCameraPreview,
                                                                   OnDone);

            _cameraDevice.CreateCaptureSession(outputSurfaces,
                                               new CameraCaptureStateCallback(captureBuilder,
                                                                              captureListener,
                                                                              _backgroundHandler),
                                               _backgroundHandler);
        }