diff --git a/include/libcamera/internal/v4l2_subdevice.h b/include/libcamera/internal/v4l2_subdevice.h
index 00be17bb1465..69862de0585a 100644
--- a/include/libcamera/internal/v4l2_subdevice.h
+++ b/include/libcamera/internal/v4l2_subdevice.h
@@ -101,6 +101,9 @@ protected:
 private:
 	LIBCAMERA_DISABLE_COPY(V4L2Subdevice)
 
+	std::optional<ColorSpace>
+	toColorSpace(const v4l2_mbus_framefmt &format) const;
+
 	std::vector<unsigned int> enumPadCodes(unsigned int pad);
 	std::vector<SizeRange> enumPadSizes(unsigned int pad,
 					    unsigned int code);
diff --git a/src/libcamera/v4l2_subdevice.cpp b/src/libcamera/v4l2_subdevice.cpp
index 95bfde340d8c..f3a9a0096c6c 100644
--- a/src/libcamera/v4l2_subdevice.cpp
+++ b/src/libcamera/v4l2_subdevice.cpp
@@ -477,6 +477,27 @@ V4L2Subdevice::Formats V4L2Subdevice::formats(unsigned int pad)
 	return formats;
 }
 
+std::optional<ColorSpace> V4L2Subdevice::toColorSpace(const v4l2_mbus_framefmt &format) const
+{
+	if (format.colorspace == V4L2_COLORSPACE_DEFAULT)
+		return std::nullopt;
+
+	PixelFormatInfo::ColourEncoding colourEncoding;
+	auto iter = formatInfoMap.find(format.code);
+	if (iter != formatInfoMap.end()) {
+		colourEncoding = iter->second.colourEncoding;
+	} else {
+		LOG(V4L2, Warning)
+			<< "Unknown subdev format "
+			<< utils::hex(format.code, 4)
+			<< ", defaulting to RGB encoding";
+
+		colourEncoding = PixelFormatInfo::ColourEncodingRGB;
+	}
+
+	return V4L2Device::toColorSpace(format, colourEncoding);
+}
+
 /**
  * \brief Retrieve the image format set on one of the V4L2 subdevice pads
  * \param[in] pad The 0-indexed pad number the format is to be retrieved from
@@ -503,20 +524,7 @@ int V4L2Subdevice::getFormat(unsigned int pad, V4L2SubdeviceFormat *format,
 	format->size.width = subdevFmt.format.width;
 	format->size.height = subdevFmt.format.height;
 	format->mbus_code = subdevFmt.format.code;
-
-	PixelFormatInfo::ColourEncoding colourEncoding;
-	auto iter = formatInfoMap.find(subdevFmt.format.code);
-	if (iter != formatInfoMap.end()) {
-		colourEncoding = iter->second.colourEncoding;
-	} else {
-		LOG(V4L2, Warning)
-			<< "Unknown subdev format "
-			<< utils::hex(subdevFmt.format.code, 4)
-			<< ", defaulting to RGB encoding";
-
-		colourEncoding = PixelFormatInfo::ColourEncodingRGB;
-	}
-	format->colorSpace = toColorSpace(subdevFmt.format, colourEncoding);
+	format->colorSpace = toColorSpace(subdevFmt.format);
 
 	return 0;
 }
@@ -562,20 +570,7 @@ int V4L2Subdevice::setFormat(unsigned int pad, V4L2SubdeviceFormat *format,
 	format->size.width = subdevFmt.format.width;
 	format->size.height = subdevFmt.format.height;
 	format->mbus_code = subdevFmt.format.code;
-
-	PixelFormatInfo::ColourEncoding colourEncoding;
-	auto iter = formatInfoMap.find(subdevFmt.format.code);
-	if (iter != formatInfoMap.end()) {
-		colourEncoding = iter->second.colourEncoding;
-	} else {
-		LOG(V4L2, Warning)
-			<< "Unknown subdev format "
-			<< utils::hex(subdevFmt.format.code, 4)
-			<< ", defaulting to RGB encoding";
-
-		colourEncoding = PixelFormatInfo::ColourEncodingRGB;
-	}
-	format->colorSpace = toColorSpace(subdevFmt.format, colourEncoding);
+	format->colorSpace = toColorSpace(subdevFmt.format);
 
 	return 0;
 }
