Message ID | 20210122131451.726584-1-naush@raspberrypi.com |
---|---|
State | Superseded |
Headers | show |
Series |
|
Related | show |
On 22/01/2021 13:14, Naushir Patuck 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> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com> > --- > .../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 524cc960dd37..d9895c779725 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 get requested format on " << stream->name() > + << ", returned " << format.toString(); > + return -EINVAL; > } > + > + cfg.setStream(stream); > + stream->setExternal(true); > } > > /* ISP statistics output format. */ >
diff --git a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp index 524cc960dd37..d9895c779725 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 get requested format on " << stream->name() + << ", returned " << format.toString(); + return -EINVAL; } + + cfg.setStream(stream); + stream->setExternal(true); } /* ISP statistics output format. */