[libcamera-devel] [PATCH v3 6/7] libcamera: Add validateColorSpaces to CameraConfiguration class

David Plowman david.plowman at raspberrypi.com
Mon Oct 25 11:56:32 CEST 2021


Hi Naush

Thanks for the review.

On Mon, 25 Oct 2021 at 09:34, Naushir Patuck <naush at raspberrypi.com> wrote:
>
> Hi David,
>
> Thank you for your work.
>
>
> On Wed, 20 Oct 2021 at 12:08, David Plowman <david.plowman at raspberrypi.com> wrote:
>>
>> This method checks that the requested color spaces are sensible and do
>> not contain any undefined enum values. It also initialises the
>> "actual" color space field to the same value as the one requested, in
>> the expectation that the rest of the validate() method will be able to
>> check this.
>>
>> Signed-off-by: David Plowman <david.plowman at raspberrypi.com>
>> ---
>>  include/libcamera/camera.h |  2 ++
>>  src/libcamera/camera.cpp   | 53 ++++++++++++++++++++++++++++++++++++++
>>  2 files changed, 55 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 71809bcd..79451ef4 100644
>> --- a/src/libcamera/camera.cpp
>> +++ b/src/libcamera/camera.cpp
>> @@ -19,6 +19,7 @@
>>  #include <libcamera/stream.h>
>>
>>  #include "libcamera/internal/camera.h"
>> +#include "libcamera/internal/formats.h"
>>  #include "libcamera/internal/pipeline_handler.h"
>>
>>  /**
>> @@ -313,6 +314,58 @@ 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;
>> +}
>
>
> Not as part of this series, but we ought to move this to the PixelFomat class,
> there is an identical function in our pipeline handler :-)

Hehe. I think I made the same comment about one of your patches recently!

>
>>
>> +
>> +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.width * cfg.size.height > config_[i].size.width * config_[i].size.height))
>
>
> You can replace this with "cfg.size > config_[i].size". Apart from that:

Wow, you can do that? How cool, I never knew!

Thanks

David

>
> Reviewed-by: Naushir Patuck <naush at raspberrypi.com>
>
>>
>> +                       index = i;
>> +       }
>> +
>> +       /*
>> +        * Here we force raw streams to the correct color space and signal
>> +        * an error if we encounter anything undefined. We handle the case
>> +        * where all output streams are to share a color space, which we
>> +        * choose to be the color space of the largest stream.
>> +        */
>> +       for (auto &cfg : config_) {
>> +               ColorSpace initialColorSpace = cfg.requestedColorSpace;
>> +
>> +               if (isRaw(cfg.pixelFormat))
>> +                       cfg.requestedColorSpace = ColorSpace::Raw;
>> +               else if (!cfg.requestedColorSpace.isFullyDefined()) {
>> +                       LOG(Camera, Error) << "Stream has undefined color space";
>> +                       cfg.requestedColorSpace = ColorSpace::Jpeg;
>> +               } else if (sharedColorSpace)
>> +                       cfg.requestedColorSpace = config_[index].requestedColorSpace;
>> +
>> +               if (cfg.requestedColorSpace != initialColorSpace)
>> +                       status = Adjusted;
>> +
>> +               /*
>> +                * We also initialise the actual color space as if the
>> +                * hardware can do what we want. But note that the rest
>> +                * of the validate() method may change this.
>> +                */
>> +               cfg.actualColorSpace = cfg.requestedColorSpace;
>> +       }
>> +
>> +       return status;
>> +}
>> +
>>  /**
>>   * \var CameraConfiguration::transform
>>   * \brief User-specified transform to be applied to the image
>> --
>> 2.20.1
>>


More information about the libcamera-devel mailing list