mirror of
https://git.libcamera.org/libcamera/libcamera.git
synced 2025-07-12 23:09:45 +03:00
libcamera: pipeline: Introduce stopDevice()
Since a queue of waiting Requests has been introduced, not all Requests queued to the PipelineHandler are immediately queued to the device. As a Camera can be stopped at any time, it is required to complete the waiting requests after the ones queued to the device had been completed. Introduce a pure virtual PipelineHandler::stopDevice() function to be implemented by pipeline handlers and make the PipelineHandler::stop() function call it before completing pending requests. Signed-off-by: Jacopo Mondi <jacopo@jmondi.org> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
This commit is contained in:
parent
6cd5c958b7
commit
f6b6f15b54
8 changed files with 42 additions and 15 deletions
|
@ -55,7 +55,7 @@ public:
|
|||
std::vector<std::unique_ptr<FrameBuffer>> *buffers) = 0;
|
||||
|
||||
virtual int start(Camera *camera, const ControlList *controls) = 0;
|
||||
virtual void stop(Camera *camera) = 0;
|
||||
void stop(Camera *camera);
|
||||
bool hasPendingRequests(const Camera *camera) const;
|
||||
|
||||
void queueRequest(Request *request);
|
||||
|
@ -70,6 +70,7 @@ protected:
|
|||
void hotplugMediaDevice(MediaDevice *media);
|
||||
|
||||
virtual int queueRequestDevice(Camera *camera, Request *request) = 0;
|
||||
virtual void stopDevice(Camera *camera) = 0;
|
||||
|
||||
CameraManager *manager_;
|
||||
|
||||
|
|
|
@ -139,7 +139,7 @@ public:
|
|||
std::vector<std::unique_ptr<FrameBuffer>> *buffers) override;
|
||||
|
||||
int start(Camera *camera, const ControlList *controls) override;
|
||||
void stop(Camera *camera) override;
|
||||
void stopDevice(Camera *camera) override;
|
||||
|
||||
int queueRequestDevice(Camera *camera, Request *request) override;
|
||||
|
||||
|
@ -803,7 +803,7 @@ error:
|
|||
return ret;
|
||||
}
|
||||
|
||||
void PipelineHandlerIPU3::stop(Camera *camera)
|
||||
void PipelineHandlerIPU3::stopDevice(Camera *camera)
|
||||
{
|
||||
IPU3CameraData *data = cameraData(camera);
|
||||
int ret = 0;
|
||||
|
|
|
@ -298,7 +298,7 @@ public:
|
|||
std::vector<std::unique_ptr<FrameBuffer>> *buffers) override;
|
||||
|
||||
int start(Camera *camera, const ControlList *controls) override;
|
||||
void stop(Camera *camera) override;
|
||||
void stopDevice(Camera *camera) override;
|
||||
|
||||
int queueRequestDevice(Camera *camera, Request *request) override;
|
||||
|
||||
|
@ -943,7 +943,7 @@ int PipelineHandlerRPi::start(Camera *camera, const ControlList *controls)
|
|||
return 0;
|
||||
}
|
||||
|
||||
void PipelineHandlerRPi::stop(Camera *camera)
|
||||
void PipelineHandlerRPi::stopDevice(Camera *camera)
|
||||
{
|
||||
RPiCameraData *data = cameraData(camera);
|
||||
|
||||
|
|
|
@ -146,7 +146,7 @@ public:
|
|||
std::vector<std::unique_ptr<FrameBuffer>> *buffers) override;
|
||||
|
||||
int start(Camera *camera, const ControlList *controls) override;
|
||||
void stop(Camera *camera) override;
|
||||
void stopDevice(Camera *camera) override;
|
||||
|
||||
int queueRequestDevice(Camera *camera, Request *request) override;
|
||||
|
||||
|
@ -827,7 +827,7 @@ int PipelineHandlerRkISP1::start(Camera *camera, [[maybe_unused]] const ControlL
|
|||
return ret;
|
||||
}
|
||||
|
||||
void PipelineHandlerRkISP1::stop(Camera *camera)
|
||||
void PipelineHandlerRkISP1::stopDevice(Camera *camera)
|
||||
{
|
||||
RkISP1CameraData *data = cameraData(camera);
|
||||
int ret;
|
||||
|
|
|
@ -279,7 +279,7 @@ public:
|
|||
std::vector<std::unique_ptr<FrameBuffer>> *buffers) override;
|
||||
|
||||
int start(Camera *camera, const ControlList *controls) override;
|
||||
void stop(Camera *camera) override;
|
||||
void stopDevice(Camera *camera) override;
|
||||
|
||||
bool match(DeviceEnumerator *enumerator) override;
|
||||
|
||||
|
@ -1036,7 +1036,7 @@ int SimplePipelineHandler::start(Camera *camera, [[maybe_unused]] const ControlL
|
|||
return 0;
|
||||
}
|
||||
|
||||
void SimplePipelineHandler::stop(Camera *camera)
|
||||
void SimplePipelineHandler::stopDevice(Camera *camera)
|
||||
{
|
||||
SimpleCameraData *data = cameraData(camera);
|
||||
V4L2VideoDevice *video = data->video_;
|
||||
|
|
|
@ -74,7 +74,7 @@ public:
|
|||
std::vector<std::unique_ptr<FrameBuffer>> *buffers) override;
|
||||
|
||||
int start(Camera *camera, const ControlList *controls) override;
|
||||
void stop(Camera *camera) override;
|
||||
void stopDevice(Camera *camera) override;
|
||||
|
||||
int queueRequestDevice(Camera *camera, Request *request) override;
|
||||
|
||||
|
@ -250,7 +250,7 @@ int PipelineHandlerUVC::start(Camera *camera, [[maybe_unused]] const ControlList
|
|||
return 0;
|
||||
}
|
||||
|
||||
void PipelineHandlerUVC::stop(Camera *camera)
|
||||
void PipelineHandlerUVC::stopDevice(Camera *camera)
|
||||
{
|
||||
UVCCameraData *data = cameraData(camera);
|
||||
data->video_->streamOff();
|
||||
|
|
|
@ -91,7 +91,7 @@ public:
|
|||
std::vector<std::unique_ptr<FrameBuffer>> *buffers) override;
|
||||
|
||||
int start(Camera *camera, const ControlList *controls) override;
|
||||
void stop(Camera *camera) override;
|
||||
void stopDevice(Camera *camera) override;
|
||||
|
||||
int queueRequestDevice(Camera *camera, Request *request) override;
|
||||
|
||||
|
@ -359,7 +359,7 @@ int PipelineHandlerVimc::start(Camera *camera, [[maybe_unused]] const ControlLis
|
|||
return 0;
|
||||
}
|
||||
|
||||
void PipelineHandlerVimc::stop(Camera *camera)
|
||||
void PipelineHandlerVimc::stopDevice(Camera *camera)
|
||||
{
|
||||
VimcCameraData *data = cameraData(camera);
|
||||
data->video_->streamOff();
|
||||
|
|
|
@ -267,8 +267,7 @@ void PipelineHandler::unlock()
|
|||
*/
|
||||
|
||||
/**
|
||||
* \fn PipelineHandler::stop()
|
||||
* \brief Stop capturing from all running streams
|
||||
* \brief Stop capturing from all running streams and cancel pending requests
|
||||
* \param[in] camera The camera to stop
|
||||
*
|
||||
* This function stops capturing and processing requests immediately. All
|
||||
|
@ -276,6 +275,33 @@ void PipelineHandler::unlock()
|
|||
*
|
||||
* \context This function is called from the CameraManager thread.
|
||||
*/
|
||||
void PipelineHandler::stop(Camera *camera)
|
||||
{
|
||||
/* Stop the pipeline handler and let the queued requests complete. */
|
||||
stopDevice(camera);
|
||||
|
||||
/* Cancel and signal as complete all waiting requests. */
|
||||
while (!waitingRequests_.empty()) {
|
||||
Request *request = waitingRequests_.front();
|
||||
waitingRequests_.pop();
|
||||
|
||||
request->_d()->cancel();
|
||||
completeRequest(request);
|
||||
}
|
||||
|
||||
/* Make sure no requests are pending. */
|
||||
Camera::Private *data = camera->_d();
|
||||
ASSERT(data->queuedRequests_.empty());
|
||||
}
|
||||
|
||||
/**
|
||||
* \fn PipelineHandler::stopDevice()
|
||||
* \brief Stop capturing from all running streams
|
||||
* \param[in] camera The camera to stop
|
||||
*
|
||||
* This function stops capturing and processing requests immediately. All
|
||||
* pending requests are cancelled and complete immediately in an error state.
|
||||
*/
|
||||
|
||||
/**
|
||||
* \brief Determine if the camera has any requests pending
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue