[libcamera-devel] [PATCH v2 12/27] libcamera: v4l2_videodevice: Take stride into account to compute offsets

Hirokazu Honda hiroh at chromium.org
Mon Sep 6 15:01:00 CEST 2021


Hi Laurent, thank you for the patch.

On Mon, Sep 6, 2021 at 4:13 PM Jean-Michel Hautbois
<jeanmichel.hautbois at ideasonboard.com> wrote:
>
> Hi Laurent,
>
> On 06/09/2021 04:00, Laurent Pinchart wrote:
> > When creating FrameBuffer instances, the V4L2VideoDevice computes plane
> > offsets using minimal stride for the format. This doesn't always produce
> > a valid result when the device requires padding at the end of lines. Fix
> > it by computing offsets using the stride reported by V4L2.
> >
> > Signed-off-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
> Reviewed-by: Jean-Michel Hautbois <jeanmichel.hautbois at ideasonboard.com>

Reviewed-by: Hirokazu Honda <hiroh at chromium.org>
> > ---
> >  src/libcamera/v4l2_videodevice.cpp | 16 +++++++++++++---
> >  1 file changed, 13 insertions(+), 3 deletions(-)
> >
> > diff --git a/src/libcamera/v4l2_videodevice.cpp b/src/libcamera/v4l2_videodevice.cpp
> > index 88535f5a07c7..c6c9263c49e9 100644
> > --- a/src/libcamera/v4l2_videodevice.cpp
> > +++ b/src/libcamera/v4l2_videodevice.cpp
> > @@ -1354,11 +1354,21 @@ std::unique_ptr<FrameBuffer> V4L2VideoDevice::createBuffer(unsigned int index)
> >               size_t offset = 0;
> >
> >               for (size_t i = 0; i < planes.size(); ++i) {
> > +                     /*
> > +                      * The stride is reported by V4L2 for the first plane
> > +                      * only. Compute the stride of the other planes by
> > +                      * taking the horizontal subsampling factor into
> > +                      * account, which is equal to the bytesPerGroup ratio of
> > +                      * the planes.
> > +                      */
> > +                     unsigned int stride = format_.planes[0].bpl
> > +                                         * formatInfo_->planes[i].bytesPerGroup
> > +                                         / formatInfo_->planes[0].bytesPerGroup;
> > +
> >                       planes[i].fd = fd;
> >                       planes[i].offset = offset;
> > -
> > -                     /* \todo Take the V4L2 stride into account */
> > -                     planes[i].length = formatInfo_->planeSize(format_.size, i);
> > +                     planes[i].length = formatInfo_->planeSize(format_.size.height,
> > +                                                               i, stride);
> >                       offset += planes[i].length;
> >               }
> >       }
> >


More information about the libcamera-devel mailing list