Message ID | 20211201154434.23127-8-david.plowman@raspberrypi.com |
---|---|
State | Superseded |
Headers | show |
Series |
|
Related | show |
Hi David On Wed, Dec 01, 2021 at 03:44:33PM +0000, 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@raspberrypi.com> > --- > include/libcamera/camera.h | 2 ++ > src/libcamera/camera.cpp | 69 ++++++++++++++++++++++++++++++++++++++ > 2 files changed, 71 insertions(+) > > diff --git a/include/libcamera/camera.h b/include/libcamera/camera.h > index a7759ccb..fdcb66ab 100644 > --- a/include/libcamera/camera.h > +++ b/include/libcamera/camera.h > @@ -69,6 +69,8 @@ public: > protected: > CameraConfiguration(); > > + Status validateColorSpaces(bool shareOutputColorSpaces); > + > std::vector<StreamConfiguration> config_; > }; > > diff --git a/src/libcamera/camera.cpp b/src/libcamera/camera.cpp > index 400a7cf0..a6a93dd0 100644 > --- a/src/libcamera/camera.cpp > +++ b/src/libcamera/camera.cpp > @@ -14,12 +14,14 @@ > #include <libcamera/base/log.h> > #include <libcamera/base/thread.h> > > +#include <libcamera/color_space.h> > #include <libcamera/framebuffer_allocator.h> > #include <libcamera/request.h> > #include <libcamera/stream.h> > > #include "libcamera/internal/camera.h" > #include "libcamera/internal/camera_controls.h" > +#include "libcamera/internal/formats.h" > #include "libcamera/internal/pipeline_handler.h" > > /** > @@ -314,6 +316,73 @@ 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; > +} > + > +/** > + * \brief Check the color spaces requested for each stream Check and update > + * \param[in] shareOutputColorSpaces Force all output streams to share the same > + * color space The non-RAW output streams ? > + * > + * This function performs certain consistency checks on the color spaces of > + * the streams and may adjust them so that: > + * > + * - Any raw streams have the Raw color space > + * - If shareOutputColorSpaces is set, all output streams are forced to share > + * the same color space (this may be a constraint on some platforms). > + * > + * It is optional for a pipeline handler to use this method. > + * > + * \return A CameraConfiguration::Status value that describes the validation > + * status. > + * \retval CameraConfiguration::Invalid The configuration is invalid and can't > + * be adjusted. This may only occur in extreme cases such as when the > + * configuration is empty. > + * \retval CameraConfigutation::Adjusted The configuration has been adjusted > + * and is now valid. Parameters may have changed for any stream, and stream > + * configurations may have been removed. The caller shall check the > + * configuration carefully. > + * \retval CameraConfiguration::Valid The configuration was already valid and > + * hasn't been adjusted. Thanks for the detailed documentation of the return values, much apreciated. I think you could have saved it though, as CameraConfiguration::Status is fully documented, so it's enough to say we return that. > + */ > +CameraConfiguration::Status CameraConfiguration::validateColorSpaces(bool shareOutputColorSpaces) > +{ > + Status status = Valid; > + > + /* > + * Set all raw streams to the Raw color space, and make a note of the largest > + * non-raw stream with a defined color space (if there is one). > + */ > + int index = -1; > + for (auto [i, cfg] : utils::enumerate(config_)) { > + if (isRaw(cfg.pixelFormat)) { > + if (cfg.colorSpace != ColorSpace::Raw) { > + cfg.colorSpace = ColorSpace::Raw; > + status = Adjusted; > + } > + else if (cfg.colorSpace && (index == -1 || cfg.size > config_[i].size)) > + index = i; > + } > + > + if (index < 0 || !shareOutputColorSpaces) > + return status; > + > + /* Make all output color spaces the same, if requested. */ > + for (auto &cfg : config_) { > + if (!isRaw(cfg.pixelFormat) && > + cfg.colorSpace != config_[index].colorSpace) { > + cfg.colorSpace = config_[index].colorSpace; > + status = Adjusted; > + } > + } > + > + return status; > +} > + Reviewed-by: Jacopo Mondi <jacopo@jmondi.org> Thanks j > /** > * \var CameraConfiguration::transform > * \brief User-specified transform to be applied to the image > -- > 2.30.2 >
diff --git a/include/libcamera/camera.h b/include/libcamera/camera.h index a7759ccb..fdcb66ab 100644 --- a/include/libcamera/camera.h +++ b/include/libcamera/camera.h @@ -69,6 +69,8 @@ public: protected: CameraConfiguration(); + Status validateColorSpaces(bool shareOutputColorSpaces); + std::vector<StreamConfiguration> config_; }; diff --git a/src/libcamera/camera.cpp b/src/libcamera/camera.cpp index 400a7cf0..a6a93dd0 100644 --- a/src/libcamera/camera.cpp +++ b/src/libcamera/camera.cpp @@ -14,12 +14,14 @@ #include <libcamera/base/log.h> #include <libcamera/base/thread.h> +#include <libcamera/color_space.h> #include <libcamera/framebuffer_allocator.h> #include <libcamera/request.h> #include <libcamera/stream.h> #include "libcamera/internal/camera.h" #include "libcamera/internal/camera_controls.h" +#include "libcamera/internal/formats.h" #include "libcamera/internal/pipeline_handler.h" /** @@ -314,6 +316,73 @@ 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; +} + +/** + * \brief Check the color spaces requested for each stream + * \param[in] shareOutputColorSpaces Force all output streams to share the same + * color space + * + * This function performs certain consistency checks on the color spaces of + * the streams and may adjust them so that: + * + * - Any raw streams have the Raw color space + * - If shareOutputColorSpaces is set, all output streams are forced to share + * the same color space (this may be a constraint on some platforms). + * + * It is optional for a pipeline handler to use this method. + * + * \return A CameraConfiguration::Status value that describes the validation + * status. + * \retval CameraConfiguration::Invalid The configuration is invalid and can't + * be adjusted. This may only occur in extreme cases such as when the + * configuration is empty. + * \retval CameraConfigutation::Adjusted The configuration has been adjusted + * and is now valid. Parameters may have changed for any stream, and stream + * configurations may have been removed. The caller shall check the + * configuration carefully. + * \retval CameraConfiguration::Valid The configuration was already valid and + * hasn't been adjusted. + */ +CameraConfiguration::Status CameraConfiguration::validateColorSpaces(bool shareOutputColorSpaces) +{ + Status status = Valid; + + /* + * Set all raw streams to the Raw color space, and make a note of the largest + * non-raw stream with a defined color space (if there is one). + */ + int index = -1; + for (auto [i, cfg] : utils::enumerate(config_)) { + if (isRaw(cfg.pixelFormat)) { + if (cfg.colorSpace != ColorSpace::Raw) { + cfg.colorSpace = ColorSpace::Raw; + status = Adjusted; + } + else if (cfg.colorSpace && (index == -1 || cfg.size > config_[i].size)) + index = i; + } + + if (index < 0 || !shareOutputColorSpaces) + return status; + + /* Make all output color spaces the same, if requested. */ + for (auto &cfg : config_) { + if (!isRaw(cfg.pixelFormat) && + cfg.colorSpace != config_[index].colorSpace) { + cfg.colorSpace = config_[index].colorSpace; + status = Adjusted; + } + } + + return status; +} + /** * \var CameraConfiguration::transform * \brief User-specified transform to be applied to the image
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@raspberrypi.com> --- include/libcamera/camera.h | 2 ++ src/libcamera/camera.cpp | 69 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 71 insertions(+)