[libcamera-devel] [PATCH v6 6/7] libcamera: Add validateColorSpaces to CameraConfiguration class
Umang Jain
umang.jain at ideasonboard.com
Thu Nov 25 05:26:16 CET 2021
Hi David,
On 11/24/21 5:36 PM, David Plowman wrote:
> Hi Umang
>
> Thanks for the question below!
>
> On Tue, 23 Nov 2021 at 11:43, Umang Jain <umang.jain at ideasonboard.com> wrote:
>> Hi David,
>>
>> One clarification below please,
>>
>> On 11/18/21 8:49 PM, David Plowman wrote:
>>> This method forces raw streams to have the "raw" color space, and also
>>> optionally makes all output streams to share the same color space as
>>> some platforms may require this.
>>>
>>> Signed-off-by: David Plowman <david.plowman at raspberrypi.com>
>>> ---
>>> include/libcamera/camera.h | 2 ++
>>> src/libcamera/camera.cpp | 51 ++++++++++++++++++++++++++++++++++++++
>>> 2 files changed, 53 insertions(+)
>>>
>>> diff --git a/include/libcamera/camera.h b/include/libcamera/camera.h
>>> index 601ee46e..fdab4410 100644
>>> --- a/include/libcamera/camera.h
>>> +++ b/include/libcamera/camera.h
>>> @@ -69,6 +69,8 @@ public:
>>> protected:
>>> CameraConfiguration();
>>>
>>> + Status validateColorSpaces(bool sharedColorSpace);
>>> +
>>> std::vector<StreamConfiguration> config_;
>>> };
>>>
>>> diff --git a/src/libcamera/camera.cpp b/src/libcamera/camera.cpp
>>> index 400a7cf0..c1541685 100644
>>> --- a/src/libcamera/camera.cpp
>>> +++ b/src/libcamera/camera.cpp
>>> @@ -20,6 +20,7 @@
>>>
>>> #include "libcamera/internal/camera.h"
>>> #include "libcamera/internal/camera_controls.h"
>>> +#include "libcamera/internal/formats.h"
>>> #include "libcamera/internal/pipeline_handler.h"
>>>
>>> /**
>>> @@ -314,6 +315,56 @@ std::size_t CameraConfiguration::size() const
>>> return config_.size();
>>> }
>>>
>>> +static bool isRaw(const PixelFormat &pixFmt)
>>> +{
>>> + const PixelFormatInfo &info = PixelFormatInfo::info(pixFmt);
>>> + return info.isValid() &&
>>> + info.colourEncoding == PixelFormatInfo::ColourEncodingRAW;
>>> +}
>>> +
>>> +CameraConfiguration::Status CameraConfiguration::validateColorSpaces(bool sharedColorSpace)
>>> +{
>>> + Status status = Valid;
>>> +
>>> + /* Find the largest non-raw stream (if any). */
>>> + int index = -1;
>>> + for (unsigned int i = 0; i < config_.size(); i++) {
>>> + const StreamConfiguration &cfg = config_[i];
>>> + if (!isRaw(cfg.pixelFormat) && (index < 0 || cfg.size > config_[i].size))
>>> + index = i;
>>> + }
>>> +
>>> + /*
>>> + * Here we force raw streams to the correct color space. We handle
>>> + * the case where all output streams are to share a color space,
>>> + * which will match the color space of the largest (non-raw) stream.
>>> + */
>>
>> I am questioning this policy, whether or not, let it best be left to
>> specific platform instead? Or let me take a step back and ask how does
>> one arrive at this policy or is it somewhat a convention?
> Yes, it's a good point. I think it's mostly a platform-specific thing.
> On the other hand, I can imagine that at least some other platforms
> will be like the Pi in this respect (having a single output colour
> space, though more than one output stream). So that's why I decided to
> put the code somewhere common, where pipeline handlers can call it if
> they want.
>
> If there are other behaviours or constraints that we think might be
> "common", maybe we could add those too?
I see, it's fine for now, I can think pipeline-handler can chose to do
their own thing, when diverged cases arrive or spotted. As Jacopo said,
it seems a bit-early but also seem okay to me.
> Best regards
> David
>
>>> + for (auto &cfg : config_) {
>>> + std::optional<ColorSpace> initialColorSpace = cfg.colorSpace;
>>> +
>>> + if (isRaw(cfg.pixelFormat))
>>> + cfg.colorSpace = ColorSpace::Raw;
>>> + else if (sharedColorSpace) {
>>> + /*
>>> + * When all outputs share a color space, use the biggest
>>> + * output if that was set. If that was blank, but this
>>> + * stream's is not, then use this stream's color space for
>>> + * largest stream.
>>> + * (index must be != -1 if there are any non-raw streams.)
>>> + */
>>> + if (config_[index].colorSpace)
>>> + cfg.colorSpace = config_[index].colorSpace;
>>> + else if (cfg.colorSpace)
>>> + config_[index].colorSpace = cfg.colorSpace;
>>> + }
>>> +
>>> + if (cfg.colorSpace != initialColorSpace)
>>> + status = Adjusted;
>>> + }
>>> +
>>> + return status;
>>> +}
>>> +
>>> /**
>>> * \var CameraConfiguration::transform
>>> * \brief User-specified transform to be applied to the image
More information about the libcamera-devel
mailing list