[libcamera-devel] [PATCH] libcamera: vimc: Adjust crop rectangle
Laurent Pinchart
laurent.pinchart at ideasonboard.com
Fri May 1 18:43:56 CEST 2020
Hi Jacopo,
On Fri, May 01, 2020 at 07:19:10PM +0300, Laurent Pinchart wrote:
> On Fri, May 01, 2020 at 05:16:51PM +0200, Jacopo Mondi wrote:
> > Since the Linux kernel commit:
> > 69e39d40587b ("media: vimc: Implement get/set selection in sink")
> > the crop rectangle on the VIMC scaler sink pad needs to be
> > reset to match the requested format to avoid hitting a pipeline format
> > mis-configurations when the applied format is larger than the one
>
> s/mis-configurations/misconfiguration/
>
> > set in a previous capture session.
> >
> > As the V4L2 specification is not clear on what the correct behaviour
> > is, if the crop rectangle should be reset automatically or not on a
> > set_fmt operation, momentary fix the pipeline handler to please the
> > driver and manually reset the crop rectangle.
> >
> > Signed-off-by: Jacopo Mondi <jacopo at jmondi.org>
>
> Reviewed-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
>
> > ---
> >
> > Tested on v5.6, please test on older kernel releases.
>
> I'll test it now.
Tested-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com> # on v5.4.28
I however get
[5:10:58.023539356] [23523] ERROR V4L2 v4l2_subdevice.cpp:301 'Scaler': Unable to set rectangle 0 on pad 0: Inappropriate ioctl for device
which I understand is expected as the driver doesn't support that ioctl
yet.
If you think it's worth it, you may want to squash
diff --git a/src/libcamera/pipeline/vimc/vimc.cpp b/src/libcamera/pipeline/vimc/vimc.cpp
index 0b8a0a0c6890..0742b37c377a 100644
--- a/src/libcamera/pipeline/vimc/vimc.cpp
+++ b/src/libcamera/pipeline/vimc/vimc.cpp
@@ -12,6 +12,7 @@
#include <tuple>
#include <linux/media-bus-format.h>
+#include <linux/version.h>
#include <ipa/ipa_interface.h>
#include <ipa/ipa_module_info.h>
@@ -226,15 +227,17 @@ int PipelineHandlerVimc::configure(Camera *camera, CameraConfiguration *config)
if (ret)
return ret;
- Rectangle crop = {
- .x = 0,
- .y = 0,
- .width = subformat.size.width,
- .height = subformat.size.height,
- };
- ret = data->scaler_->setSelection(0, V4L2_SEL_TGT_CROP, &crop);
- if (ret && ret != -ENOTTY)
- return ret;
+ if (data->media_->version() >= KERNEL_VERSION(5, 6, 0)) {
+ Rectangle crop = {
+ .x = 0,
+ .y = 0,
+ .width = subformat.size.width,
+ .height = subformat.size.height,
+ };
+ ret = data->scaler_->setSelection(0, V4L2_SEL_TGT_CROP, &crop);
+ if (ret)
+ return ret;
+ }
subformat.size = cfg.size;
ret = data->scaler_->setFormat(1, &subformat);
with this patch, and base is on top of
[PATCH 1/2] libcamera: media_device: Expose media device API version number
[PATCH 2/2] libcamera: pipeline: vimc: Store media device pointer in camera data
> > ---
> > src/libcamera/pipeline/vimc/vimc.cpp | 10 ++++++++++
> > 1 file changed, 10 insertions(+)
> >
> > diff --git a/src/libcamera/pipeline/vimc/vimc.cpp b/src/libcamera/pipeline/vimc/vimc.cpp
> > index ccfd7f86d158..339d1cf653fb 100644
> > --- a/src/libcamera/pipeline/vimc/vimc.cpp
> > +++ b/src/libcamera/pipeline/vimc/vimc.cpp
> > @@ -224,6 +224,16 @@ int PipelineHandlerVimc::configure(Camera *camera, CameraConfiguration *config)
> > if (ret)
> > return ret;
> >
> > + Rectangle crop = {
> > + .x = 0,
> > + .y = 0,
> > + .width = subformat.size.width,
> > + .height = subformat.size.height,
> > + };
> > + ret = data->scaler_->setSelection(0, V4L2_SEL_TGT_CROP, &crop);
> > + if (ret && ret != -ENOTTY)
> > + return ret;
> > +
> > subformat.size = cfg.size;
> > ret = data->scaler_->setFormat(1, &subformat);
> > if (ret)
--
Regards,
Laurent Pinchart
More information about the libcamera-devel
mailing list