diff --git a/src/cam/drm.cpp b/src/cam/drm.cpp
index da317e27cb19..ac47b8bd3287 100644
--- a/src/cam/drm.cpp
+++ b/src/cam/drm.cpp
@@ -595,12 +595,12 @@ const Object *Device::object(uint32_t id)
 std::unique_ptr<FrameBuffer> Device::createFrameBuffer(
 	const libcamera::FrameBuffer &buffer,
 	const libcamera::PixelFormat &format,
-	const libcamera::Size &size, unsigned int stride)
+	const libcamera::Size &size,
+	const std::array<uint32_t, 4> &strides)
 {
 	std::unique_ptr<FrameBuffer> fb{ new FrameBuffer(this) };
 
 	uint32_t handles[4] = {};
-	uint32_t pitches[4] = {};
 	uint32_t offsets[4] = {};
 	int ret;
 
@@ -623,13 +623,12 @@ std::unique_ptr<FrameBuffer> Device::createFrameBuffer(
 		fb->planes_.push_back({ handle });
 
 		handles[i] = handle;
-		pitches[i] = stride;
 		offsets[i] = 0; /* TODO */
 		++i;
 	}
 
 	ret = drmModeAddFB2(fd_, size.width, size.height, format.fourcc(), handles,
-			    pitches, offsets, &fb->id_, 0);
+			    strides.data(), offsets, &fb->id_, 0);
 	if (ret < 0) {
 		ret = -errno;
 		std::cerr
diff --git a/src/cam/drm.h b/src/cam/drm.h
index ee2304025208..00f7e798b771 100644
--- a/src/cam/drm.h
+++ b/src/cam/drm.h
@@ -7,9 +7,11 @@
 #ifndef __CAM_DRM_H__
 #define __CAM_DRM_H__
 
+#include <array>
 #include <list>
 #include <map>
 #include <memory>
+#include <stdint.h>
 #include <string>
 #include <vector>
 
@@ -298,7 +300,8 @@ public:
 	std::unique_ptr<FrameBuffer> createFrameBuffer(
 		const libcamera::FrameBuffer &buffer,
 		const libcamera::PixelFormat &format,
-		const libcamera::Size &size, unsigned int stride);
+		const libcamera::Size &size,
+		const std::array<uint32_t, 4> &strides);
 
 	libcamera::Signal<AtomicRequest *> requestComplete;
 
diff --git a/src/cam/kms_sink.cpp b/src/cam/kms_sink.cpp
index 8c0b79c63922..658192efc105 100644
--- a/src/cam/kms_sink.cpp
+++ b/src/cam/kms_sink.cpp
@@ -7,10 +7,12 @@
 
 #include "kms_sink.h"
 
+#include <array>
 #include <algorithm>
 #include <assert.h>
 #include <iostream>
 #include <memory>
+#include <stdint.h>
 #include <string.h>
 
 #include <libcamera/camera.h>
@@ -65,8 +67,32 @@ KMSSink::KMSSink(const std::string &connectorName)
 
 void KMSSink::mapBuffer(libcamera::FrameBuffer *buffer)
 {
+	std::array<uint32_t, 4> strides = {};
+
+	/* \todo Should libcamera report per-plane strides ? */
+	unsigned int uvStrideMultiplier;
+
+	switch (format_) {
+	case libcamera::formats::NV24:
+	case libcamera::formats::NV42:
+		uvStrideMultiplier = 4;
+		break;
+	case libcamera::formats::YUV420:
+	case libcamera::formats::YVU420:
+	case libcamera::formats::YUV422:
+		uvStrideMultiplier = 1;
+		break;
+	default:
+		uvStrideMultiplier = 2;
+		break;
+	}
+
+	strides[0] = stride_;
+	for (unsigned int i = 1; i < buffer->planes().size(); ++i)
+		strides[i] = stride_ * uvStrideMultiplier / 2;
+
 	std::unique_ptr<DRM::FrameBuffer> drmBuffer =
-		dev_.createFrameBuffer(*buffer, format_, size_, stride_);
+		dev_.createFrameBuffer(*buffer, format_, size_, strides);
 	if (!drmBuffer)
 		return;
 
