@@ -8,12 +8,14 @@
#pragma once
#include <memory>
+#include <optional>
#include <string>
#include <vector>
#include <libcamera/base/class.h>
#include <libcamera/base/log.h>
+#include <libcamera/color_space.h>
#include <libcamera/geometry.h>
#include "libcamera/internal/formats.h"
@@ -27,6 +29,7 @@ class MediaDevice;
struct V4L2SubdeviceFormat {
uint32_t mbus_code;
Size size;
+ std::optional<ColorSpace> colorSpace;
const std::string toString() const;
uint8_t bitsPerPixel() const;
@@ -642,6 +642,7 @@ V4L2SubdeviceFormat CameraSensor::getFormat(const std::vector<unsigned int> &mbu
V4L2SubdeviceFormat format{
.mbus_code = bestCode,
.size = *bestSize,
+ .colorSpace = ColorSpace::Raw,
};
return format;
@@ -322,10 +322,9 @@ V4L2SubdeviceFormat CIO2Device::getSensorFormat(const std::vector<unsigned int>
return {};
}
- V4L2SubdeviceFormat format{
- .mbus_code = bestCode,
- .size = bestSize,
- };
+ V4L2SubdeviceFormat format{};
+ format.mbus_code = bestCode;
+ format.size = bestSize;
return format;
}
@@ -457,7 +457,9 @@ int SimpleCameraData::init()
* formats on the video node.
*/
for (unsigned int code : sensor_->mbusCodes()) {
- V4L2SubdeviceFormat format{ code, sensor_->resolution() };
+ V4L2SubdeviceFormat format{};
+ format.mbus_code = code;
+ format.size = sensor_->resolution();
ret = setupFormats(&format, V4L2Subdevice::TryFormat);
if (ret < 0) {
@@ -908,7 +910,9 @@ int SimplePipelineHandler::configure(Camera *camera, CameraConfiguration *c)
return ret;
const SimpleCameraData::Configuration *pipeConfig = config->pipeConfig();
- V4L2SubdeviceFormat format{ pipeConfig->code, data->sensor_->resolution() };
+ V4L2SubdeviceFormat format{};
+ format.mbus_code = pipeConfig->code;
+ format.size = data->sensor_->resolution();
ret = data->setupFormats(&format, V4L2Subdevice::ActiveFormat);
if (ret < 0)
@@ -169,6 +169,21 @@ const std::map<uint32_t, V4L2SubdeviceFormatInfo> formatInfoMap = {
* \brief The image size in pixels
*/
+/**
+ * \var V4L2SubdeviceFormat::colorSpace
+ * \brief The color space of the pixels
+ *
+ * The color space of the image. When setting the format this may be
+ * unset, in which case the driver gets to use its default color space.
+ * After being set, this value should contain the color space that
+ * was actually used. If this value is unset, then the color space chosen
+ * by the driver could not be represented by the ColorSpace class (and
+ * should probably be added).
+ *
+ * It is up to the pipeline handler or application to check if the
+ * resulting color space is acceptable.
+ */
+
/**
* \brief Assemble and return a string describing the format
* \return A string describing the V4L2SubdeviceFormat