[libcamera-devel] [PATCH v4 08/31] libcamera: ipu3: Implement camera start/stop
Laurent Pinchart
laurent.pinchart at ideasonboard.com
Thu Mar 21 10:58:11 CET 2019
Hi Jacopo,
Thank you for the patch.
On Wed, Mar 20, 2019 at 05:30:32PM +0100, Jacopo Mondi wrote:
> Start and stop video devices in the pipeline.
>
> Signed-off-by: Jacopo Mondi <jacopo at jmondi.org>
> ---
> src/libcamera/pipeline/ipu3/ipu3.cpp | 54 ++++++++++++++++++++++++----
> 1 file changed, 48 insertions(+), 6 deletions(-)
>
> diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp
> index 2975c218f6c9..994c95692dd4 100644
> --- a/src/libcamera/pipeline/ipu3/ipu3.cpp
> +++ b/src/libcamera/pipeline/ipu3/ipu3.cpp
> @@ -334,12 +334,52 @@ int PipelineHandlerIPU3::freeBuffers(Camera *camera, Stream *stream)
> int PipelineHandlerIPU3::start(Camera *camera)
> {
> IPU3CameraData *data = cameraData(camera);
> - V4L2Device *cio2 = data->cio2.output;
> int ret;
>
> - ret = cio2->streamOn();
> + /*
> + * Enqueue all available buffers to the CIO2 unit to start frame
> + * capture. Start ImgU video devices and queue buffers to the output
> + * ones at queueRequest() time.
"Start the ImgU video devices, buffers will be queued to the ImgU output
and viewfinder when requests will be queued." ?
Reviewed-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
> + */
> + for (Buffer &buffer : data->cio2.pool.buffers()) {
> + ret = data->cio2.output->queueBuffer(&buffer);
> + if (ret)
> + return ret;
> + }
> +
> + ret = data->cio2.output->streamOn();
> if (ret) {
> - LOG(IPU3, Info) << "Failed to start camera " << camera->name();
> + LOG(IPU3, Error) << "Failed to start CIO2";
> + stop(camera);
> + return ret;
> + }
> +
> + /* Start the ImgU video devices. */
> + ret = data->imgu->output->streamOn();
> + if (ret) {
> + LOG(IPU3, Error) << "Failed to start ImgU output";
> + stop(camera);
> + return ret;
> + }
> +
> + ret = data->imgu->viewfinder->streamOn();
> + if (ret) {
> + LOG(IPU3, Error) << "Failed to start ImgU viewfinder";
> + stop(camera);
> + return ret;
> + }
> +
> + ret = data->imgu->stat->streamOn();
> + if (ret) {
> + LOG(IPU3, Error) << "Failed to start ImgU stat";
> + stop(camera);
> + return ret;
> + }
> +
> + ret = data->imgu->input->streamOn();
> + if (ret) {
> + LOG(IPU3, Error) << "Failed to start ImgU input";
> + stop(camera);
> return ret;
> }
>
> @@ -349,10 +389,12 @@ int PipelineHandlerIPU3::start(Camera *camera)
> void PipelineHandlerIPU3::stop(Camera *camera)
> {
> IPU3CameraData *data = cameraData(camera);
> - V4L2Device *cio2 = data->cio2.output;
>
> - if (cio2->streamOff())
> - LOG(IPU3, Info) << "Failed to stop camera " << camera->name();
> + data->cio2.output->streamOff();
> + data->imgu->output->streamOff();
> + data->imgu->viewfinder->streamOff();
> + data->imgu->stat->streamOff();
> + data->imgu->input->streamOff();
>
> PipelineHandler::stop(camera);
> }
--
Regards,
Laurent Pinchart
More information about the libcamera-devel
mailing list