summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/libcamera/camera.cpp17
1 files changed, 15 insertions, 2 deletions
diff --git a/src/libcamera/camera.cpp b/src/libcamera/camera.cpp
index 96a579eb..45bbc354 100644
--- a/src/libcamera/camera.cpp
+++ b/src/libcamera/camera.cpp
@@ -339,6 +339,7 @@ public:
CameraAvailable,
CameraAcquired,
CameraConfigured,
+ CameraStopping,
CameraRunning,
};
@@ -383,6 +384,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 requests are being completed or
+ * 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
@@ -1067,6 +1077,8 @@ int Camera::stop()
LOG(Camera, Debug) << "Stopping capture";
+ d->setState(Private::CameraStopping);
+
d->pipe_->invokeMethod(&PipelineHandler::stop, ConnectionTypeBlocking,
this);
@@ -1087,7 +1099,8 @@ void Camera::requestComplete(Request *request)
Private *const d = LIBCAMERA_D_PTR();
/* Disconnected cameras are still able to complete requests. */
- if (d->isAccessAllowed(Private::CameraRunning, true))
+ if (d->isAccessAllowed(Private::CameraStopping, Private::CameraRunning,
+ true))
LOG(Camera, Fatal) << "Trying to complete a request when stopped";
requestCompleted.emit(request);