[libcamera-devel] [PATCH v3 30/30] v4l2: Sum bytesused for all planes when dequeuing buffer

Laurent Pinchart laurent.pinchart at ideasonboard.com
Tue Sep 7 00:56:36 CEST 2021


The V4L2 compatibility layer supports the single-planar API only, and
thuss expose a single V4L2 buffer plane to applications, regardless of
the number of planes in the FrameBuffer. For multi-planar frame buffers,
the bytesused value isn't correct as it only takes the first plane into
account. Fix it by summing the bytesused values for all FrameBuffer
planes.

Signed-off-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
---
 src/v4l2/v4l2_camera_proxy.cpp | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/src/v4l2/v4l2_camera_proxy.cpp b/src/v4l2/v4l2_camera_proxy.cpp
index 07d2250bb846..aeffef26c5bf 100644
--- a/src/v4l2/v4l2_camera_proxy.cpp
+++ b/src/v4l2/v4l2_camera_proxy.cpp
@@ -11,6 +11,7 @@
 #include <array>
 #include <errno.h>
 #include <linux/videodev2.h>
+#include <numeric>
 #include <set>
 #include <string.h>
 #include <sys/mman.h>
@@ -211,7 +212,11 @@ void V4L2CameraProxy::updateBuffers()
 
 		switch (fmd.status) {
 		case FrameMetadata::FrameSuccess:
-			buf.bytesused = fmd.planes()[0].bytesused;
+			buf.bytesused = std::accumulate(fmd.planes().begin(),
+							fmd.planes().end(), 0,
+							[](unsigned int total, const auto &plane) {
+								return total + plane.bytesused;
+							});
 			buf.field = V4L2_FIELD_NONE;
 			buf.timestamp.tv_sec = fmd.timestamp / 1000000000;
 			buf.timestamp.tv_usec = fmd.timestamp % 1000000;
-- 
Regards,

Laurent Pinchart



More information about the libcamera-devel mailing list