<div dir="ltr"><div dir="ltr">Hi David,<div><br></div><div>Thank you for your work.</div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Tue, 8 Jun 2021 at 15:44, David Plowman <<a href="mailto:david.plowman@raspberrypi.com">david.plowman@raspberrypi.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">This class represents a colour space by defining its YCbCr encoding,<br>
the transfer (gamma) function is uses, and whether the output is full<br>
or limited range.<br>
---<br>
 include/libcamera/color_space.h | 94 +++++++++++++++++++++++++++++++++<br>
 include/libcamera/meson.build   |  1 +<br>
 src/libcamera/color_space.cpp   | 43 +++++++++++++++<br>
 src/libcamera/meson.build       |  1 +<br>
 4 files changed, 139 insertions(+)<br>
 create mode 100644 include/libcamera/color_space.h<br>
 create mode 100644 src/libcamera/color_space.cpp<br>
<br>
diff --git a/include/libcamera/color_space.h b/include/libcamera/color_space.h<br>
new file mode 100644<br>
index 00000000..3d990f99<br>
--- /dev/null<br>
+++ b/include/libcamera/color_space.h<br>
@@ -0,0 +1,94 @@<br>
+/* SPDX-License-Identifier: LGPL-2.1-or-later */<br>
+/*<br>
+ * Copyright (C) 2021, Raspberry Pi (Trading) Limited<br>
+ *<br>
+ * color_space.h - color space definitions<br>
+ */<br>
+<br>
+#ifndef __LIBCAMERA_COLOR_SPACE_H__<br>
+#define __LIBCAMERA_COLOR_SPACE_H__<br>
+<br>
+#include <string><br>
+<br>
+namespace libcamera {<br>
+<br>
+class ColorSpace<br>
+{<br>
+public:<br>
+       enum class Encoding : int {<br>
+               UNDEFINED,<br>
+               RAW,<br>
+               REC601,<br>
+               REC709,<br>
+               REC2020,<br>
+               VIDEO,<br>
+       };<br>
+<br>
+       enum class TransferFunction : int {<br>
+               UNDEFINED,<br>
+               IDENTITY,<br>
+               SRGB,<br>
+               REC709,<br>
+       };<br>
+<br>
+       enum class Range : int {<br>
+               UNDEFINED,<br>
+               FULL,<br>
+               LIMITED,<br>
+       };<br>
+<br>
+       constexpr ColorSpace(Encoding e, TransferFunction t, Range r)<br>
+               : encoding(e), transferFunction(t), range(r)<br>
+       {<br>
+       }<br>
+<br>
+       constexpr ColorSpace()<br>
+               : ColorSpace(Encoding::UNDEFINED, TransferFunction::UNDEFINED, Range::UNDEFINED)<br>
+       {<br>
+       }<br>
+<br>
+       static const ColorSpace UNDEFINED;<br>
+       static const ColorSpace RAW;<br>
+       static const ColorSpace JFIF;<br>
+       static const ColorSpace SMPTE170M;<br>
+       static const ColorSpace REC709;<br>
+       static const ColorSpace REC2020;<br>
+       static const ColorSpace VIDEO;<br>
+<br>
+       Encoding encoding;<br>
+       TransferFunction transferFunction;<br>
+       Range range;<br>
+<br>
+       bool isFullyDefined() const<br>
+       {<br>
+               return encoding != Encoding::UNDEFINED &&<br>
+                      transferFunction != TransferFunction::UNDEFINED &&<br>
+                      range != Range::UNDEFINED;<br>
+       }<br>
+<br>
+       const std::string toString() const;<br>
+};<br>
+<br>
+constexpr ColorSpace ColorSpace::UNDEFINED = { Encoding::UNDEFINED, TransferFunction::UNDEFINED, Range::UNDEFINED };<br></blockquote><div><br></div><div>Do you think we need ColorSpace::UNDEFINED?  Not sure why anyone would need to use it?</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
+constexpr ColorSpace ColorSpace::RAW = { Encoding::RAW, TransferFunction::IDENTITY, Range::FULL };<br>
+constexpr ColorSpace ColorSpace::JFIF = { Encoding::REC601, TransferFunction::SRGB, Range::FULL };<br>
+constexpr ColorSpace ColorSpace::SMPTE170M = { Encoding::REC601, TransferFunction::REC709, Range::LIMITED };<br>
+constexpr ColorSpace ColorSpace::REC709 = { Encoding::REC709, TransferFunction::REC709, Range::LIMITED };<br>
+constexpr ColorSpace ColorSpace::REC2020 = { Encoding::REC2020, TransferFunction::REC709, Range::LIMITED };<br>
+constexpr ColorSpace ColorSpace::VIDEO = { Encoding::VIDEO, TransferFunction::REC709, Range::LIMITED };<br>
+<br>
+static inline bool operator==(const ColorSpace &lhs, const ColorSpace &rhs)<br>
+{<br>
+       return lhs.encoding == rhs.encoding &&<br>
+              lhs.transferFunction == rhs.transferFunction &&<br>
+              lhs.range == rhs.range;<br>
+}<br>
+<br>
+static inline bool operator!=(const ColorSpace &lhs, const ColorSpace &rhs)<br>
+{<br>
+       return !(lhs == rhs);<br>
+}<br>
+<br>
+} /* namespace libcamera */<br>
+<br>
+#endif /* __LIBCAMERA_COLOR_SPACE_H__ */<br>
diff --git a/include/libcamera/meson.build b/include/libcamera/meson.build<br>
index 086c958b..7d61d285 100644<br>
--- a/include/libcamera/meson.build<br>
+++ b/include/libcamera/meson.build<br>
@@ -6,6 +6,7 @@ libcamera_public_headers = files([<br>
     'camera.h',<br>
     'camera_manager.h',<br>
     'class.h',<br>
+    'color_space.h',<br>
     'compiler.h',<br>
     'controls.h',<br>
     'file_descriptor.h',<br>
diff --git a/src/libcamera/color_space.cpp b/src/libcamera/color_space.cpp<br>
new file mode 100644<br>
index 00000000..888762ae<br>
--- /dev/null<br>
+++ b/src/libcamera/color_space.cpp<br>
@@ -0,0 +1,43 @@<br>
+/* SPDX-License-Identifier: LGPL-2.1-or-later */<br>
+/*<br>
+ * Copyright (C) 2021, Raspberry Pi (Trading) Limited<br>
+ *<br>
+ * color_space.cpp - color spaces.<br>
+ */<br>
+<br>
+#include <libcamera/color_space.h><br>
+<br>
+/**<br>
+ * \file color_space.h<br>
+ * \brief Class and enums to represent colour spaces.<br>
+ */<br>
+<br>
+namespace libcamera {<br>
+<br>
+const std::string ColorSpace::toString() const<br>
+{<br>
+       static const char *encodings[] = {<br>
+               "UNDEFINED",<br>
+               "RAW",<br>
+               "REC601",<br>
+               "REC709",<br>
+               "REC2020",<br>
+       };<br>
+       static const char *transferFunctions[] = {<br>
+               "UNDEFINED",<br>
+               "IDENTITY",<br>
+               "SRGB",<br>
+               "REC709",<br>
+       };<br>
+       static const char *ranges[] = {<br>
+               "UNDEFINED",<br>
+               "FULL",<br>
+               "LIMITED",<br>
+       };<br>
+<br>
+       return std::string(encodings[static_cast<int>(encoding)]) + "+" +<br>
+              std::string(transferFunctions[static_cast<int>(transferFunction)]) + "+" +<br>
+              std::string(ranges[static_cast<int>(range)]);<br></blockquote><div><br></div><div>I wonder if using stringstream might be more efficient here?</div><div><br></div><div>Regards,</div><div>Naush</div><div><br></div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
+}<br>
+<br>
+} /* namespace libcamera */<br>
diff --git a/src/libcamera/meson.build b/src/libcamera/meson.build<br>
index 7e19a177..f7b48a32 100644<br>
--- a/src/libcamera/meson.build<br>
+++ b/src/libcamera/meson.build<br>
@@ -11,6 +11,7 @@ libcamera_sources = files([<br>
     'camera_sensor.cpp',<br>
     'camera_sensor_properties.cpp',<br>
     'class.cpp',<br>
+    'color_space.cpp',<br>
     'controls.cpp',<br>
     'control_serializer.cpp',<br>
     'control_validator.cpp',<br>
-- <br>
2.20.1<br>
<br>
</blockquote></div></div>