[libcamera-devel] [PATCH v3 08/11] libcamera: camera: Extend with a Stopping state
Laurent Pinchart
laurent.pinchart at ideasonboard.com
Fri Mar 26 03:36:42 CET 2021
Hi Kieran,
Thank you for the patch.
On Thu, Mar 25, 2021 at 01:42:28PM +0000, Kieran Bingham wrote:
> When the camera is being stop()ped, active requests will complete. These
> may trigger an application to re-queue those requests to the camera but
> that is not permitted.
Maybe ", and is an error in the application." to be clear ?
>
> Extend the camera state to include a stopping state which is entered as
> soon as a call to stop() is made. At this point, any request queued will
> be rejected with a warning, while any pending requests are either
> successfully completed or cancelled.
Should it be an error instead of a warning ?
> When the pipeline handler has finished stopping, the camera state will
> transition to the CameraConfigured state where it can begin to accept
> requests again, and be restarted.
>
> Signed-off-by: Kieran Bingham <kieran.bingham at ideasonboard.com>
> ---
> src/libcamera/camera.cpp | 18 ++++++++++++++++--
> 1 file changed, 16 insertions(+), 2 deletions(-)
>
> diff --git a/src/libcamera/camera.cpp b/src/libcamera/camera.cpp
> index 336ab8695ab3..7f7956ba732f 100644
> --- a/src/libcamera/camera.cpp
> +++ b/src/libcamera/camera.cpp
> @@ -339,6 +339,7 @@ public:
> CameraAvailable,
> CameraAcquired,
> CameraConfigured,
> + CameraStopping,
> CameraRunning,
> };
>
> @@ -382,6 +383,7 @@ static const char *const camera_state_names[] = {
> "Available",
> "Acquired",
> "Configured",
> + "Stopping",
> "Running",
> };
>
> @@ -492,6 +494,7 @@ void Camera::Private::setState(State state)
> * node [shape = doublecircle ]; Available;
> * node [shape = circle ]; Acquired;
> * node [shape = circle ]; Configured;
> + * node [shape = circle ]; Stopping;
> * node [shape = circle ]; Running;
> *
> * Available -> Available [label = "release()"];
> @@ -504,7 +507,8 @@ void Camera::Private::setState(State state)
> * Configured -> Configured [label = "configure(), createRequest()"];
> * Configured -> Running [label = "start()"];
> *
> - * Running -> Configured [label = "stop()"];
> + * Running -> Stopping [label = "stop()"];
> + * Stopping -> Configured;
> * Running -> Running [label = "createRequest(), queueRequest()"];
> * }
> * \enddot
> @@ -524,6 +528,12 @@ void Camera::Private::setState(State state)
> * release() the camera and to get back to the Available state or start()
> * it to progress to the Running state.
> *
> + * \subsubsection Stopping
> + * The camera has been asked to stop. Pending reqeusts are being completed or
s/reqeusts/requests/
Reviewed-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
> + * cancelled, and no new requests are permitted to be queued. The camera will
> + * transition to the Configured state when all queued requests have been
> + * returned to the application.
> + *
> * \subsubsection Running
> * The camera is running and ready to process requests queued by the
> * application. The camera remains in this state until it is stopped and moved
> @@ -1071,6 +1081,8 @@ int Camera::stop()
>
> LOG(Camera, Debug) << "Stopping capture";
>
> + d->setState(Private::CameraStopping);
> +
> d->pipe_->invokeMethod(&PipelineHandler::stop, ConnectionTypeBlocking,
> this);
>
> @@ -1091,7 +1103,9 @@ void Camera::requestComplete(Request *request)
> Private *const d = LIBCAMERA_D_PTR();
>
> /* Disconnected cameras are still able to complete requests. */
> - int ret = d->isAccessAllowed(__FUNCTION__, Private::CameraRunning);
> + int ret = d->isAccessAllowed(__FUNCTION__,
> + Private::CameraStopping,
> + Private::CameraRunning);
> if (ret < 0 && ret != -ENODEV)
> LOG(Camera, Fatal) << "Trying to complete a request when stopped";
>
--
Regards,
Laurent Pinchart
More information about the libcamera-devel
mailing list