[libcamera-devel] [PATCH v3 08/11] libcamera: camera: Extend with a Stopping state
Laurent Pinchart
laurent.pinchart at ideasonboard.com
Fri Mar 26 16:55:33 CET 2021
Hi Kieran,
On Fri, Mar 26, 2021 at 03:48:07PM +0000, Kieran Bingham wrote:
> On 26/03/2021 02:36, Laurent Pinchart wrote:
> > 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 ?
>
> Yes,
>
> >> 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 ?
>
> The warning will come from the isAccessAllowed log level.
>
> I don't want to duplicate an error message, but it would probably be
> considered an error.
>
> We could try to pass in a log level to the isAccessAllowed, but I think
> we're overloading those operators enough already ...
>
> Perhaps we could actually raise the log from isAccessAllowed further
> from Debug to Warning, to all the way to Error?
>
> If an operation is made in the wrong state - it's an error isn't it ?
Yes, I think so.
> >> 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/
>
> Fixed, thanks.
>
> > 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