private static async Task VideoWorkerDoWork(
            CameraVideoSettings settings,
            Action <byte[]> onDataCallback,
            Action onExitCallback)
        {
            try
            {
                await ProcessRunner.RunProcessAsync(
                    settings.CommandName,
                    settings.CreateProcessArguments(),
                    (data, proc) => onDataCallback?.Invoke(data),
                    null,
                    true,
                    _videoTokenSource.Token);

                onExitCallback?.Invoke();
            }
            catch
            {
                // swallow
            }
            finally
            {
                Instance.CloseVideoStream();
                OperationDone.Set();
            }
        }
        /// <summary>
        /// Opens the video stream with a timeout of 0 (running indefinitely) at 1080p resolution, variable bitrate and 25 FPS.
        /// No preview is shown
        /// </summary>
        /// <param name="onDataCallback">The on data callback.</param>
        /// <param name="onExitCallback">The on exit callback.</param>
        public void OpenVideoStream(Action <byte[]> onDataCallback, Action onExitCallback = null)
        {
            var settings = new CameraVideoSettings
            {
                CaptureTimeoutMilliseconds = 0,
                CaptureDisplayPreview      = false,
                CaptureWidth  = 1920,
                CaptureHeight = 1080
            };

            OpenVideoStream(settings, onDataCallback, onExitCallback);
        }
        /// <summary>
        /// Opens the video stream with the supplied settings. Capture Timeout Milliseconds has to be 0 or greater
        /// </summary>
        /// <param name="settings">The settings.</param>
        /// <param name="onDataCallback">The on data callback.</param>
        /// <param name="onExitCallback">The on exit callback.</param>
        /// <exception cref="InvalidOperationException">Cannot use camera module because it is currently busy.</exception>
        /// <exception cref="ArgumentException">CaptureTimeoutMilliseconds</exception>
        public void OpenVideoStream(CameraVideoSettings settings, Action <byte[]> onDataCallback, Action onExitCallback)
        {
            if (Instance.IsBusy)
            {
                throw new InvalidOperationException("Cannot use camera module because it is currently busy.");
            }

            if (settings.CaptureTimeoutMilliseconds < 0)
            {
                throw new ArgumentException($"{nameof(settings.CaptureTimeoutMilliseconds)} needs to be greater than or equal to 0");
            }

            try
            {
                OperationDone.Reset();
                _videoStreamTask = Task.Factory.StartNew(() => VideoWorkerDoWork(settings, onDataCallback, onExitCallback), _videoTokenSource.Token);
            }
            catch
            {
                OperationDone.Set();
                throw;
            }
        }