[libcamera-devel] [PATCH v5 14/19] libcamera: ipu3: Implement camera start/stop
Niklas Söderlund
niklas.soderlund at ragnatech.se
Tue Apr 2 13:36:27 CEST 2019
Hi Jacopo,
Thanks for your work.
On 2019-03-26 09:38:57 +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 | 93 ++++++++++++++++++++++++++--
> 1 file changed, 87 insertions(+), 6 deletions(-)
>
> diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp
> index d3519bb1d536..5b3c44174566 100644
> --- a/src/libcamera/pipeline/ipu3/ipu3.cpp
> +++ b/src/libcamera/pipeline/ipu3/ipu3.cpp
> @@ -111,6 +111,9 @@ public:
> int exportBuffers(enum OutputId id, unsigned int count);
> void freeBuffers();
>
> + int start();
> + void stop();
> +
> unsigned int index_;
> std::string name_;
> MediaDevice *media_;
> @@ -154,6 +157,9 @@ public:
> BufferPool *exportBuffers();
> void freeBuffers();
>
> + int start();
> + void stop();
> +
> V4L2Device *output_;
> V4L2Subdevice *csi2_;
> V4L2Subdevice *sensor_;
> @@ -371,12 +377,24 @@ int PipelineHandlerIPU3::freeBuffers(Camera *camera, Stream *stream)
> int PipelineHandlerIPU3::start(Camera *camera)
> {
> IPU3CameraData *data = cameraData(camera);
> - V4L2Device *cio2 = data->cio2_.output_;
> + CIO2Device *cio2 = &data->cio2_;
> + ImgUDevice *imgu = data->imgu_;
> int ret;
>
> - ret = cio2->streamOn();
> + /*
> + * Start the ImgU video devices, buffers will be queued to the
> + * ImgU output and viewfinder when requests will be queued.
> + */
> + ret = cio2->start();
> + if (ret) {
> + cio2->stop();
> + return ret;
> + }
> +
> + ret = imgu->start();
> if (ret) {
> - LOG(IPU3, Info) << "Failed to start camera " << camera->name();
> + imgu->stop();
> + cio2->stop();
> return ret;
> }
>
> @@ -386,10 +404,9 @@ 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_.stop();
> + data->imgu_->stop();
Not complaining only pointing out it looks odd that one is a pointer and
the other one not :-)
With Laurents comments addressed feel free to add,
Reviewed-by: Niklas Söderlund <niklas.soderlund at ragnatech.se>
>
> PipelineHandler::stop(camera);
> }
> @@ -833,6 +850,46 @@ void ImgUDevice::freeBuffers()
> LOG(IPU3, Error) << "Failed to release ImgU input buffers";
> }
>
> +int ImgUDevice::start()
> +{
> + int ret;
> +
> + /* Start the ImgU video devices. */
> + ret = output_->streamOn();
> + if (ret) {
> + LOG(IPU3, Error) << "Failed to start ImgU output";
> + return ret;
> + }
> +
> + ret = viewfinder_->streamOn();
> + if (ret) {
> + LOG(IPU3, Error) << "Failed to start ImgU viewfinder";
> + return ret;
> + }
> +
> + ret = stat_->streamOn();
> + if (ret) {
> + LOG(IPU3, Error) << "Failed to start ImgU stat";
> + return ret;
> + }
> +
> + ret = input_->streamOn();
> + if (ret) {
> + LOG(IPU3, Error) << "Failed to start ImgU input";
> + return ret;
> + }
> +
> + return 0;
> +}
> +
> +void ImgUDevice::stop()
> +{
> + output_->streamOff();
> + viewfinder_->streamOff();
> + stat_->streamOff();
> + input_->streamOff();
> +}
> +
> /*------------------------------------------------------------------------------
> * CIO2 Device
> */
> @@ -1026,6 +1083,30 @@ void CIO2Device::freeBuffers()
> LOG(IPU3, Error) << "Failed to release CIO2 buffers";
> }
>
> +int CIO2Device::start()
> +{
> + int ret;
> +
> + for (Buffer &buffer : pool_.buffers()) {
> + ret = output_->queueBuffer(&buffer);
> + if (ret)
> + return ret;
> + }
> +
> + ret = output_->streamOn();
> + if (ret) {
> + LOG(IPU3, Error) << "Failed to start CIO2";
> + return ret;
> + }
> +
> + return 0;
> +}
> +
> +void CIO2Device::stop()
> +{
> + output_->streamOff();
> +}
> +
> REGISTER_PIPELINE_HANDLER(PipelineHandlerIPU3);
>
> } /* namespace libcamera */
> --
> 2.21.0
>
> _______________________________________________
> libcamera-devel mailing list
> libcamera-devel at lists.libcamera.org
> https://lists.libcamera.org/listinfo/libcamera-devel
--
Regards,
Niklas Söderlund
More information about the libcamera-devel
mailing list