summaryrefslogtreecommitdiff
path: root/src/libcamera/v4l2_videodevice.cpp
diff options
context:
space:
mode:
authorLaurent Pinchart <laurent.pinchart@ideasonboard.com>2021-09-04 00:09:28 +0300
committerLaurent Pinchart <laurent.pinchart@ideasonboard.com>2021-09-07 19:18:18 +0300
commit88589a25318ddf08106262aada6ff71142e42c9d (patch)
tree5720160aa69a3ea3644b641f13e867ff75538096 /src/libcamera/v4l2_videodevice.cpp
parent17b9db376ccef2097018c40e17da884e619dd360 (diff)
libcamera: v4l2_videodevice: Take stride into account to compute offsets
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@ideasonboard.com> Reviewed-by: Jean-Michel Hautbois <jeanmichel.hautbois@ideasonboard.com> Reviewed-by: Hirokazu Honda <hiroh@chromium.org> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
Diffstat (limited to 'src/libcamera/v4l2_videodevice.cpp')
-rw-r--r--src/libcamera/v4l2_videodevice.cpp16
1 files changed, 13 insertions, 3 deletions
diff --git a/src/libcamera/v4l2_videodevice.cpp b/src/libcamera/v4l2_videodevice.cpp
index 88535f5a..c6c9263c 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;
}
}