libcamera: pipeline: Pass libcamera controls into pipeline_handler::start()

Applications now have the ability to pass in controls that need to be
applied on startup, rather than doing it through Request where there might
be some frames of delay in getting the controls applied.

This commit adds the ability to pass in a set of libcamera controls into
the pipeline handlers through the pipeline_handler::start() method. These
controls are provided by the application through the camera::start()
public API.

Signed-off-by: Naushir Patuck <naush@raspberrypi.com>
Reviewed-by: David Plowman <david.plowman@raspberrypi.com>
Tested-by: David Plowman <david.plowman@raspberrypi.com>
Reviewed-by: Jacopo Mondi <jacopo@jmondi.org>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
This commit is contained in:
Naushir Patuck 2020-12-04 15:31:19 +00:00 committed by Laurent Pinchart
parent ee477efde8
commit a62b35b8c0
11 changed files with 24 additions and 21 deletions

View file

@ -209,7 +209,7 @@ methods for the overridden class members.
int exportFrameBuffers(Camera *camera, Stream *stream, int exportFrameBuffers(Camera *camera, Stream *stream,
std::vector<std::unique_ptr<FrameBuffer>> *buffers) override; std::vector<std::unique_ptr<FrameBuffer>> *buffers) override;
int start(Camera *camera) override; int start(Camera *camera, ControlList *controls) override;
void stop(Camera *camera) override; void stop(Camera *camera) override;
int queueRequestDevice(Camera *camera, Request *request) override; int queueRequestDevice(Camera *camera, Request *request) override;
@ -239,7 +239,7 @@ methods for the overridden class members.
return -1; return -1;
} }
int PipelineHandlerVivid::start(Camera *camera) int PipelineHandlerVivid::start(Camera *camera, ControlList *controls)
{ {
return -1; return -1;
} }

View file

@ -103,7 +103,7 @@ public:
std::unique_ptr<Request> createRequest(uint64_t cookie = 0); std::unique_ptr<Request> createRequest(uint64_t cookie = 0);
int queueRequest(Request *request); int queueRequest(Request *request);
int start(); int start(ControlList *controls = nullptr);
int stop(); int stop();
private: private:

View file

@ -78,7 +78,7 @@ public:
virtual int exportFrameBuffers(Camera *camera, Stream *stream, virtual int exportFrameBuffers(Camera *camera, Stream *stream,
std::vector<std::unique_ptr<FrameBuffer>> *buffers) = 0; std::vector<std::unique_ptr<FrameBuffer>> *buffers) = 0;
virtual int start(Camera *camera) = 0; virtual int start(Camera *camera, ControlList *controls) = 0;
virtual void stop(Camera *camera) = 0; virtual void stop(Camera *camera) = 0;
int queueRequest(Camera *camera, Request *request); int queueRequest(Camera *camera, Request *request);

View file

@ -1002,10 +1002,12 @@ int Camera::queueRequest(Request *request)
/** /**
* \brief Start capture from camera * \brief Start capture from camera
* \param[in] controls Controls to be applied before starting the Camera
* *
* Start the camera capture session. Once the camera is started the application * Start the camera capture session, optionally providing a list of controls to
* can queue requests to the camera to process and return to the application * apply before starting. Once the camera is started the application can queue
* until the capture session is terminated with \a stop(). * requests to the camera to process and return to the application until the
* capture session is terminated with \a stop().
* *
* \context This function may only be called when the camera is in the * \context This function may only be called when the camera is in the
* Configured state as defined in \ref camera_operation, and shall be * Configured state as defined in \ref camera_operation, and shall be
@ -1016,7 +1018,7 @@ int Camera::queueRequest(Request *request)
* \retval -ENODEV The camera has been disconnected from the system * \retval -ENODEV The camera has been disconnected from the system
* \retval -EACCES The camera is not in a state where it can be started * \retval -EACCES The camera is not in a state where it can be started
*/ */
int Camera::start() int Camera::start(ControlList *controls)
{ {
Private *const d = LIBCAMERA_D_PTR(); Private *const d = LIBCAMERA_D_PTR();
@ -1027,7 +1029,7 @@ int Camera::start()
LOG(Camera, Debug) << "Starting capture"; LOG(Camera, Debug) << "Starting capture";
ret = d->pipe_->invokeMethod(&PipelineHandler::start, ret = d->pipe_->invokeMethod(&PipelineHandler::start,
ConnectionTypeBlocking, this); ConnectionTypeBlocking, this, controls);
if (ret) if (ret)
return ret; return ret;

View file

@ -105,7 +105,7 @@ public:
int exportFrameBuffers(Camera *camera, Stream *stream, int exportFrameBuffers(Camera *camera, Stream *stream,
std::vector<std::unique_ptr<FrameBuffer>> *buffers) override; std::vector<std::unique_ptr<FrameBuffer>> *buffers) override;
int start(Camera *camera) override; int start(Camera *camera, ControlList *controls) override;
void stop(Camera *camera) override; void stop(Camera *camera) override;
int queueRequestDevice(Camera *camera, Request *request) override; int queueRequestDevice(Camera *camera, Request *request) override;
@ -596,7 +596,7 @@ int PipelineHandlerIPU3::freeBuffers(Camera *camera)
return 0; return 0;
} }
int PipelineHandlerIPU3::start(Camera *camera) int PipelineHandlerIPU3::start(Camera *camera, [[maybe_unused]] ControlList *controls)
{ {
IPU3CameraData *data = cameraData(camera); IPU3CameraData *data = cameraData(camera);
CIO2Device *cio2 = &data->cio2_; CIO2Device *cio2 = &data->cio2_;

View file

@ -242,7 +242,7 @@ public:
int exportFrameBuffers(Camera *camera, Stream *stream, int exportFrameBuffers(Camera *camera, Stream *stream,
std::vector<std::unique_ptr<FrameBuffer>> *buffers) override; std::vector<std::unique_ptr<FrameBuffer>> *buffers) override;
int start(Camera *camera) override; int start(Camera *camera, ControlList *controls) override;
void stop(Camera *camera) override; void stop(Camera *camera) override;
int queueRequestDevice(Camera *camera, Request *request) override; int queueRequestDevice(Camera *camera, Request *request) override;
@ -731,7 +731,7 @@ int PipelineHandlerRPi::exportFrameBuffers([[maybe_unused]] Camera *camera, Stre
return ret; return ret;
} }
int PipelineHandlerRPi::start(Camera *camera) int PipelineHandlerRPi::start(Camera *camera, [[maybe_unused]] ControlList *controls)
{ {
RPiCameraData *data = cameraData(camera); RPiCameraData *data = cameraData(camera);
int ret; int ret;

View file

@ -187,7 +187,7 @@ public:
int exportFrameBuffers(Camera *camera, Stream *stream, int exportFrameBuffers(Camera *camera, Stream *stream,
std::vector<std::unique_ptr<FrameBuffer>> *buffers) override; std::vector<std::unique_ptr<FrameBuffer>> *buffers) override;
int start(Camera *camera) override; int start(Camera *camera, ControlList *controls) override;
void stop(Camera *camera) override; void stop(Camera *camera) override;
int queueRequestDevice(Camera *camera, Request *request) override; int queueRequestDevice(Camera *camera, Request *request) override;
@ -832,7 +832,7 @@ int PipelineHandlerRkISP1::freeBuffers(Camera *camera)
return 0; return 0;
} }
int PipelineHandlerRkISP1::start(Camera *camera) int PipelineHandlerRkISP1::start(Camera *camera, [[maybe_unused]] ControlList *controls)
{ {
RkISP1CameraData *data = cameraData(camera); RkISP1CameraData *data = cameraData(camera);
int ret; int ret;

View file

@ -126,7 +126,7 @@ public:
int exportFrameBuffers(Camera *camera, Stream *stream, int exportFrameBuffers(Camera *camera, Stream *stream,
std::vector<std::unique_ptr<FrameBuffer>> *buffers) override; std::vector<std::unique_ptr<FrameBuffer>> *buffers) override;
int start(Camera *camera) override; int start(Camera *camera, ControlList *controls) override;
void stop(Camera *camera) override; void stop(Camera *camera) override;
bool match(DeviceEnumerator *enumerator) override; bool match(DeviceEnumerator *enumerator) override;
@ -646,7 +646,7 @@ int SimplePipelineHandler::exportFrameBuffers(Camera *camera, Stream *stream,
return data->video_->exportBuffers(count, buffers); return data->video_->exportBuffers(count, buffers);
} }
int SimplePipelineHandler::start(Camera *camera) int SimplePipelineHandler::start(Camera *camera, [[maybe_unused]] ControlList *controls)
{ {
SimpleCameraData *data = cameraData(camera); SimpleCameraData *data = cameraData(camera);
V4L2VideoDevice *video = data->video_; V4L2VideoDevice *video = data->video_;

View file

@ -76,7 +76,7 @@ public:
int exportFrameBuffers(Camera *camera, Stream *stream, int exportFrameBuffers(Camera *camera, Stream *stream,
std::vector<std::unique_ptr<FrameBuffer>> *buffers) override; std::vector<std::unique_ptr<FrameBuffer>> *buffers) override;
int start(Camera *camera) override; int start(Camera *camera, ControlList *controls) override;
void stop(Camera *camera) override; void stop(Camera *camera) override;
int queueRequestDevice(Camera *camera, Request *request) override; int queueRequestDevice(Camera *camera, Request *request) override;
@ -236,7 +236,7 @@ int PipelineHandlerUVC::exportFrameBuffers(Camera *camera, Stream *stream,
return data->video_->exportBuffers(count, buffers); return data->video_->exportBuffers(count, buffers);
} }
int PipelineHandlerUVC::start(Camera *camera) int PipelineHandlerUVC::start(Camera *camera, [[maybe_unused]] ControlList *controls)
{ {
UVCCameraData *data = cameraData(camera); UVCCameraData *data = cameraData(camera);
unsigned int count = data->stream_.configuration().bufferCount; unsigned int count = data->stream_.configuration().bufferCount;

View file

@ -92,7 +92,7 @@ public:
int exportFrameBuffers(Camera *camera, Stream *stream, int exportFrameBuffers(Camera *camera, Stream *stream,
std::vector<std::unique_ptr<FrameBuffer>> *buffers) override; std::vector<std::unique_ptr<FrameBuffer>> *buffers) override;
int start(Camera *camera) override; int start(Camera *camera, ControlList *controls) override;
void stop(Camera *camera) override; void stop(Camera *camera) override;
int queueRequestDevice(Camera *camera, Request *request) override; int queueRequestDevice(Camera *camera, Request *request) override;
@ -313,7 +313,7 @@ int PipelineHandlerVimc::exportFrameBuffers(Camera *camera, Stream *stream,
return data->video_->exportBuffers(count, buffers); return data->video_->exportBuffers(count, buffers);
} }
int PipelineHandlerVimc::start(Camera *camera) int PipelineHandlerVimc::start(Camera *camera, [[maybe_unused]] ControlList *controls)
{ {
VimcCameraData *data = cameraData(camera); VimcCameraData *data = cameraData(camera);
unsigned int count = data->stream_.configuration().bufferCount; unsigned int count = data->stream_.configuration().bufferCount;

View file

@ -351,6 +351,7 @@ const ControlList &PipelineHandler::properties(const Camera *camera) const
* \fn PipelineHandler::start() * \fn PipelineHandler::start()
* \brief Start capturing from a group of streams * \brief Start capturing from a group of streams
* \param[in] camera The camera to start * \param[in] camera The camera to start
* \param[in] controls Controls to be applied before starting the Camera
* *
* Start the group of streams that have been configured for capture by * Start the group of streams that have been configured for capture by
* \a configure(). The intended caller of this method is the Camera class which * \a configure(). The intended caller of this method is the Camera class which