[2/3] pipeline: virtual: Implement colorspace() getter for frame generators
diff mbox series

Message ID 20260121090705.274081-3-uajain@igalia.com
State New
Headers show
Series
  • virtual: colorspace validation fix
Related show

Commit Message

Umang Jain Jan. 21, 2026, 9:07 a.m. UTC
Each frame generator can decide what colorspace is deemed fit for their
generated frames. Provide a virtual getter colorspace() and implement it
the TestPatternGenerator and ImageFrameGenerator classes.

Signed-off-by: Umang Jain <uajain@igalia.com>
---
 .../pipeline/virtual/frame_generator.h         |  3 +++
 .../pipeline/virtual/image_frame_generator.cpp |  9 +++++++++
 .../pipeline/virtual/image_frame_generator.h   |  2 ++
 .../virtual/test_pattern_generator.cpp         | 18 ++++++++++++++++++
 .../pipeline/virtual/test_pattern_generator.h  |  4 ++++
 5 files changed, 36 insertions(+)

Comments

Barnabás Pőcze Jan. 21, 2026, 9:36 a.m. UTC | #1
Hi


2026. 01. 21. 10:07 keltezéssel, Umang Jain írta:
> Each frame generator can decide what colorspace is deemed fit for their
> generated frames. Provide a virtual getter colorspace() and implement it
> the TestPatternGenerator and ImageFrameGenerator classes.
> 
> Signed-off-by: Umang Jain <uajain@igalia.com>
> ---
>   .../pipeline/virtual/frame_generator.h         |  3 +++
>   .../pipeline/virtual/image_frame_generator.cpp |  9 +++++++++
>   .../pipeline/virtual/image_frame_generator.h   |  2 ++
>   .../virtual/test_pattern_generator.cpp         | 18 ++++++++++++++++++
>   .../pipeline/virtual/test_pattern_generator.h  |  4 ++++
>   5 files changed, 36 insertions(+)
> 
> diff --git a/src/libcamera/pipeline/virtual/frame_generator.h b/src/libcamera/pipeline/virtual/frame_generator.h
> index a0658c45..acbf2cc1 100644
> --- a/src/libcamera/pipeline/virtual/frame_generator.h
> +++ b/src/libcamera/pipeline/virtual/frame_generator.h
> @@ -7,6 +7,7 @@
>   
>   #pragma once
>   
> +#include <libcamera/color_space.h>
>   #include <libcamera/framebuffer.h>
>   #include <libcamera/geometry.h>
>   
> @@ -19,6 +20,8 @@ public:
>   
>   	virtual void configure(const Size &size) = 0;
>   
> +	virtual const ColorSpace colorspace() = 0;

  `const ColorSpace &` or just `ColorSpace`


> +
>   	virtual int generateFrame(const Size &size,
>   				  const FrameBuffer *buffer) = 0;
>   
> [...]

Patch
diff mbox series

diff --git a/src/libcamera/pipeline/virtual/frame_generator.h b/src/libcamera/pipeline/virtual/frame_generator.h
index a0658c45..acbf2cc1 100644
--- a/src/libcamera/pipeline/virtual/frame_generator.h
+++ b/src/libcamera/pipeline/virtual/frame_generator.h
@@ -7,6 +7,7 @@ 
 
 #pragma once
 
+#include <libcamera/color_space.h>
 #include <libcamera/framebuffer.h>
 #include <libcamera/geometry.h>
 
@@ -19,6 +20,8 @@  public:
 
 	virtual void configure(const Size &size) = 0;
 
+	virtual const ColorSpace colorspace() = 0;
+
 	virtual int generateFrame(const Size &size,
 				  const FrameBuffer *buffer) = 0;
 
diff --git a/src/libcamera/pipeline/virtual/image_frame_generator.cpp b/src/libcamera/pipeline/virtual/image_frame_generator.cpp
index d1545b5d..bab3cfdc 100644
--- a/src/libcamera/pipeline/virtual/image_frame_generator.cpp
+++ b/src/libcamera/pipeline/virtual/image_frame_generator.cpp
@@ -149,6 +149,15 @@  int ImageFrameGenerator::generateFrame(const Size &size, const FrameBuffer *buff
 	return 0;
 }
 
+const ColorSpace ImageFrameGenerator::colorspace()
+{
+	/*
+	 * libyuv ensures sYCC colorspace of frames during MJPGToNV12()
+	 * conversion.
+	 */
+	return ColorSpace::Sycc;
+}
+
 /*
  * \var ImageFrameGenerator::imageFrameDatas_
  * \brief List of pointers to the not scaled image buffers
diff --git a/src/libcamera/pipeline/virtual/image_frame_generator.h b/src/libcamera/pipeline/virtual/image_frame_generator.h
index 851ddbc0..24c362e6 100644
--- a/src/libcamera/pipeline/virtual/image_frame_generator.h
+++ b/src/libcamera/pipeline/virtual/image_frame_generator.h
@@ -13,6 +13,7 @@ 
 #include <sys/types.h>
 #include <vector>
 
+#include <libcamera/color_space.h>
 #include <libcamera/framebuffer.h>
 #include <libcamera/geometry.h>
 
@@ -41,6 +42,7 @@  private:
 
 	void configure(const Size &size) override;
 	int generateFrame(const Size &size, const FrameBuffer *buffer) override;
+	const ColorSpace colorspace() override;
 
 	std::vector<ImageFrameData> imageFrameDatas_;
 	std::vector<ImageFrameData> scaledFrameDatas_;
diff --git a/src/libcamera/pipeline/virtual/test_pattern_generator.cpp b/src/libcamera/pipeline/virtual/test_pattern_generator.cpp
index 745be83b..04efe6cc 100644
--- a/src/libcamera/pipeline/virtual/test_pattern_generator.cpp
+++ b/src/libcamera/pipeline/virtual/test_pattern_generator.cpp
@@ -62,6 +62,24 @@  int TestPatternGenerator::generateFrame(const Size &size,
 	return ret;
 }
 
+/*
+ * libyuv internally converts ARGB<>YUV following the BT.601 colorspace.
+ * The corresponding YCbCr encoding is ColorSpace::YcbcrEncoding::Rec601
+ * with limited range.
+ *
+ * Since the test patterns generation occurs in RGB, transfer function is set
+ * to ColorSpace::TransferFunction::Srgb. Color primaries is assumed
+ * ColorSpace::Primaries::Rec709 for the RGB test patterns.
+ */
+const ColorSpace TestPatternGenerator::colorspace()
+{
+	ColorSpace colorspace{ ColorSpace::Primaries::Rec709,
+			       ColorSpace::TransferFunction::Srgb,
+			       ColorSpace::YcbcrEncoding::Rec601,
+			       ColorSpace::Range::Limited };
+	return colorspace;
+}
+
 void ColorBarsGenerator::configure(const Size &size)
 {
 	constexpr uint8_t kColorBar[8][3] = {
diff --git a/src/libcamera/pipeline/virtual/test_pattern_generator.h b/src/libcamera/pipeline/virtual/test_pattern_generator.h
index 2a51bd31..fb2de65f 100644
--- a/src/libcamera/pipeline/virtual/test_pattern_generator.h
+++ b/src/libcamera/pipeline/virtual/test_pattern_generator.h
@@ -9,6 +9,7 @@ 
 
 #include <memory>
 
+#include <libcamera/color_space.h>
 #include <libcamera/framebuffer.h>
 #include <libcamera/geometry.h>
 
@@ -29,6 +30,9 @@  public:
 protected:
 	/* Buffer of test pattern template */
 	std::unique_ptr<uint8_t[]> template_;
+
+private:
+	const ColorSpace colorspace() override;
 };
 
 class ColorBarsGenerator : public TestPatternGenerator