[libcamera-devel] [PATCH 1/2] libcamera: ipu3: Move Imgu configuration to IPU3CameraData
Laurent Pinchart
laurent.pinchart at ideasonboard.com
Mon Mar 15 03:53:36 CET 2021
Hi Jean-Michel,
Thank you for the patch.
On Sun, Mar 14, 2021 at 08:19:01PM +0100, Jean-Michel Hautbois wrote:
> On 13/03/2021 09:31, Jacopo Mondi wrote:
> > On Fri, Mar 12, 2021 at 02:03:03PM +0100, Jean-Michel Hautbois wrote:
> >> The IPU3 IPA needs to know the BayerDownScaler (BDS) configuration to
> >> calculate the statistics grids.
Blank line.
> >> This patch makes it possible for PipelineHandlerIPU3::start() to access
> >> the BDS configuration and later pass the rectangle to the IPU3 IPA
> >> configure method.
> >
> > The alternative would be having the pipe configuration retrieved from
> > the ImgU device at start() which would require having the ImgUDevice
> > stateful, which will be very painful to implement due to the awful
> > pipe configuration procedure.
> >
> > Removing 'const' from the data_ field doesn't worry me too much, but
> > smells like we're taking a shortcut. I'm fine with that for the time
> > being.
>
> Yes, there is no real easy straightforward way unfortunately...
>
> >> Signed-off-by: Jean-Michel Hautbois <jeanmichel.hautbois at ideasonboard.com>
> >> ---
> >> src/libcamera/pipeline/ipu3/ipu3.cpp | 13 +++++++------
> >> 1 file changed, 7 insertions(+), 6 deletions(-)
> >>
> >> diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp
> >> index 00da2bb2..0d133031 100644
> >> --- a/src/libcamera/pipeline/ipu3/ipu3.cpp
> >> +++ b/src/libcamera/pipeline/ipu3/ipu3.cpp
> >> @@ -70,6 +70,8 @@ public:
> >> CIO2Device cio2_;
> >> ImgUDevice *imgu_;
> >>
> >> + ImgUDevice::PipeConfig pipeConfig_;
> >> +
> >> Stream outStream_;
> >> Stream vfStream_;
> >> Stream rawStream_;
> >> @@ -97,7 +99,6 @@ public:
> >> Status validate() override;
> >>
> >> const StreamConfiguration &cio2Format() const { return cio2Configuration_; }
> >> - const ImgUDevice::PipeConfig imguConfig() const { return pipeConfig_; }
> >>
> >> /* Cache the combinedTransform_ that will be applied to the sensor */
> >> Transform combinedTransform_;
> >> @@ -108,10 +109,9 @@ private:
> >> * corresponding Camera instance is valid. In order to borrow a
> >> * reference to the camera data, store a new reference to the camera.
> >> */
> >> - const IPU3CameraData *data_;
> >> + IPU3CameraData *data_;
> >>
> >> StreamConfiguration cio2Configuration_;
> >> - ImgUDevice::PipeConfig pipeConfig_;
> >> };
> >>
> >> class PipelineHandlerIPU3 : public PipelineHandler
> >> @@ -375,12 +375,13 @@ CameraConfiguration::Status IPU3CameraConfiguration::validate()
> >>
> >> /* Only compute the ImgU configuration if a YUV stream has been requested. */
> >> if (yuvCount) {
> >> - pipeConfig_ = data_->imgu_->calculatePipeConfig(&pipe);
> >> - if (pipeConfig_.isNull()) {
> >> + ImgUDevice::PipeConfig imguConfig = data_->imgu_->calculatePipeConfig(&pipe);
> >
> > Why do you need to go through an intermediate variable ?
> > Can't you assign data_->pipeConfig_ directly here ?
>
> Obviously yes, I can, thanks :-).
>
> >> + if (imguConfig.isNull()) {
> >> LOG(IPU3, Error) << "Failed to calculate pipe configuration: "
> >> << "unsupported resolutions.";
> >> return Invalid;
> >> }
> >> + data_->pipeConfig_ = imguConfig;
I'm sorry, that's a no-go. validate() isn't supposed to modify the
current state of the camera. An application can configure the camera,
generate a new configuration, validate it, and then throw it away. You
would end up storing the second configuration here.
You could instead store the pipe config in IPU3CameraData in
PipelineHandlerIPU3::configure(), that would be simpler. A better option
would be to move the IPA configure() call from
PipelineHandlerIPU3::start() to PipelineHandlerIPU3::configure().
> >> }
> >>
> >> return status;
> >> @@ -576,7 +577,7 @@ int PipelineHandlerIPU3::configure(Camera *camera, CameraConfiguration *c)
> >> * stream has been requested: return here to skip the ImgU configuration
> >> * part.
> >> */
> >> - ImgUDevice::PipeConfig imguConfig = config->imguConfig();
> >> + ImgUDevice::PipeConfig imguConfig = data->pipeConfig_;
> >> if (imguConfig.isNull())
> >> return 0;
> >>
--
Regards,
Laurent Pinchart
More information about the libcamera-devel
mailing list