[libcamera-devel,1/5] pipeline: raspberrypi: Refactor stream configuration routine
diff mbox series

Message ID 20210120083449.642418-2-naush@raspberrypi.com
State Superseded
Headers show
Series
  • Raspberry Pi: Colour denoise
Related show

Commit Message

Naushir Patuck Jan. 20, 2021, 8:34 a.m. UTC
Refactor the high/low resolution stream format and output selection
routine. This change is in preparation of adding 1/4 resolution output
for fast colour denoise.

Signed-off-by: Naushir Patuck <naush@raspberrypi.com>
---
 .../pipeline/raspberrypi/raspberrypi.cpp      | 57 ++++++-------------
 1 file changed, 16 insertions(+), 41 deletions(-)

Comments

David Plowman Jan. 20, 2021, 9:40 a.m. UTC | #1
Hi Naush

Thanks for this patch. No issues with this from me!

On Wed, 20 Jan 2021 at 08:34, Naushir Patuck <naush@raspberrypi.com> wrote:
>
> Refactor the high/low resolution stream format and output selection
> routine. This change is in preparation of adding 1/4 resolution output
> for fast colour denoise.
>
> Signed-off-by: Naushir Patuck <naush@raspberrypi.com>

Reviewed-by: David Plowman <david.plowman@raspberrypi.com>

Best regards
David

> ---
>  .../pipeline/raspberrypi/raspberrypi.cpp      | 57 ++++++-------------
>  1 file changed, 16 insertions(+), 41 deletions(-)
>
> diff --git a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
> index f121328ee9a9..e03bcb036f9f 100644
> --- a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
> +++ b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
> @@ -624,52 +624,27 @@ int PipelineHandlerRPi::configure(Camera *camera, CameraConfiguration *config)
>                         continue;
>                 }
>
> -               if (i == maxIndex) {
> -                       /* ISP main output format. */
> -                       V4L2VideoDevice *dev = data->isp_[Isp::Output0].dev();
> -                       V4L2PixelFormat fourcc = dev->toV4L2PixelFormat(cfg.pixelFormat);
> -                       format.size = cfg.size;
> -                       format.fourcc = fourcc;
> -
> -                       ret = dev->setFormat(&format);
> -                       if (ret)
> -                               return -EINVAL;
> -
> -                       if (format.size != cfg.size || format.fourcc != fourcc) {
> -                               LOG(RPI, Error)
> -                                       << "Failed to set format on ISP capture0 device: "
> -                                       << format.toString();
> -                               return -EINVAL;
> -                       }
> -
> -                       cfg.setStream(&data->isp_[Isp::Output0]);
> -                       data->isp_[Isp::Output0].setExternal(true);
> -               }
> +               /* The largest resolution gets routed to the ISP Output 0 node. */
> +               RPi::Stream *stream = (i == maxIndex) ? &data->isp_[Isp::Output0] :
> +                                                       &data->isp_[Isp::Output1];
>
> -               /*
> -                * ISP second output format. This fallthrough means that if a
> -                * second output stream has not been configured, we simply use
> -                * the Output0 configuration.
> -                */
> -               V4L2VideoDevice *dev = data->isp_[Isp::Output1].dev();
> -               format.fourcc = dev->toV4L2PixelFormat(cfg.pixelFormat);
> +               V4L2PixelFormat fourcc = stream->dev()->toV4L2PixelFormat(cfg.pixelFormat);
>                 format.size = cfg.size;
> +               format.fourcc = fourcc;
>
> -               ret = dev->setFormat(&format);
> -               if (ret) {
> +               ret = stream->dev()->setFormat(&format);
> +               if (ret)
> +                       return -EINVAL;
> +
> +               if (format.size != cfg.size || format.fourcc != fourcc) {
>                         LOG(RPI, Error)
> -                               << "Failed to set format on ISP capture1 device: "
> -                               << format.toString();
> -                       return ret;
> -               }
> -               /*
> -                * If we have not yet provided a stream for this config, it
> -                * means this is to be routed from Output1.
> -                */
> -               if (!cfg.stream()) {
> -                       cfg.setStream(&data->isp_[Isp::Output1]);
> -                       data->isp_[Isp::Output1].setExternal(true);
> +                               << "Failed to set format on " << stream->name()
> +                               << " to " << format.toString();
> +                       return -EINVAL;
>                 }
> +
> +               cfg.setStream(stream);
> +               stream->setExternal(true);
>         }
>
>         /* ISP statistics output format. */
> --
> 2.25.1
>
> _______________________________________________
> libcamera-devel mailing list
> libcamera-devel@lists.libcamera.org
> https://lists.libcamera.org/listinfo/libcamera-devel

Patch
diff mbox series

diff --git a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
index f121328ee9a9..e03bcb036f9f 100644
--- a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
+++ b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
@@ -624,52 +624,27 @@  int PipelineHandlerRPi::configure(Camera *camera, CameraConfiguration *config)
 			continue;
 		}
 
-		if (i == maxIndex) {
-			/* ISP main output format. */
-			V4L2VideoDevice *dev = data->isp_[Isp::Output0].dev();
-			V4L2PixelFormat fourcc = dev->toV4L2PixelFormat(cfg.pixelFormat);
-			format.size = cfg.size;
-			format.fourcc = fourcc;
-
-			ret = dev->setFormat(&format);
-			if (ret)
-				return -EINVAL;
-
-			if (format.size != cfg.size || format.fourcc != fourcc) {
-				LOG(RPI, Error)
-					<< "Failed to set format on ISP capture0 device: "
-					<< format.toString();
-				return -EINVAL;
-			}
-
-			cfg.setStream(&data->isp_[Isp::Output0]);
-			data->isp_[Isp::Output0].setExternal(true);
-		}
+		/* The largest resolution gets routed to the ISP Output 0 node. */
+		RPi::Stream *stream = (i == maxIndex) ? &data->isp_[Isp::Output0] :
+							&data->isp_[Isp::Output1];
 
-		/*
-		 * ISP second output format. This fallthrough means that if a
-		 * second output stream has not been configured, we simply use
-		 * the Output0 configuration.
-		 */
-		V4L2VideoDevice *dev = data->isp_[Isp::Output1].dev();
-		format.fourcc = dev->toV4L2PixelFormat(cfg.pixelFormat);
+		V4L2PixelFormat fourcc = stream->dev()->toV4L2PixelFormat(cfg.pixelFormat);
 		format.size = cfg.size;
+		format.fourcc = fourcc;
 
-		ret = dev->setFormat(&format);
-		if (ret) {
+		ret = stream->dev()->setFormat(&format);
+		if (ret)
+			return -EINVAL;
+
+		if (format.size != cfg.size || format.fourcc != fourcc) {
 			LOG(RPI, Error)
-				<< "Failed to set format on ISP capture1 device: "
-				<< format.toString();
-			return ret;
-		}
-		/*
-		 * If we have not yet provided a stream for this config, it
-		 * means this is to be routed from Output1.
-		 */
-		if (!cfg.stream()) {
-			cfg.setStream(&data->isp_[Isp::Output1]);
-			data->isp_[Isp::Output1].setExternal(true);
+				<< "Failed to set format on " << stream->name()
+				<< " to " << format.toString();
+			return -EINVAL;
 		}
+
+		cfg.setStream(stream);
+		stream->setExternal(true);
 	}
 
 	/* ISP statistics output format. */